ok, here is whole code
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
//#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <errno.h>
#include <math.h>
#define LINE_LENGTH 1000
typedef struct heap_node{
char* data;
struct BinaryNode* left;
struct BinaryNode* right;
}heapNode;
heapNode* root;
void childProcess(void);
int main (int argc, char* argv[]){
int numOfProcesses;
char* inputFileName;
char* outputFileName;
char filename[50];
char line[LINE_LENGTH];
int r; //M%N
int i; //for FOR loops
int j; //for FOR loops
FILE** fpArray;
FILE* inputFile;
int numOfLines = 0;
pid_t* processIDs;
if( argc < 6 || argc > 7){
printf("Wrong number of arguments\n");
printf("Usage: \n");
printf("psort -n <numOfProcesses> -i <inputfile> -o <outputfile> [-d]\n");
exit(1);
}
else {
numOfProcesses = atoi (argv[2]);
inputFileName = argv[4];
outputFileName = argv[6];
fpArray = malloc ( numOfProcesses * sizeof( FILE* ) );
processIDs = malloc ( numOfProcesses * sizeof (pid_t*));
inputFile = fopen(inputFileName, "r");
//count num of lines in the file
while( fgets(line, sizeof(line), inputFile) ){
++numOfLines;
}
//printf("File contains %d lines.\n", numOfLines);
rewind (inputFile);
for( i=0; i<numOfProcesses; ++i){
/* make a string that will be the filename */
sprintf(filename, "%d.%d.txt", (int) getpid (),(i+1));
//fpArray[i] = fopen(filename, "w");
fpArray[i] = fopen(filename, "w");
if (fpArray[i] == NULL)
{
perror ("main():"); //print the reason why fopen failed
exit (1);
}
}
r = (numOfLines%numOfProcesses);
//partition the file
for (i=0; i<(numOfProcesses-1); ++i ){
//write M-r/N records to file
for (j=0; j<((numOfLines-r)/numOfProcesses); ++j){
fgets(line, sizeof(line), inputFile);
fprintf(fpArray[i], "%s", line);
}
}
//write (M-r/N)+r records to the last file
for (j=0; j<(((numOfLines-r)/numOfProcesses)+r); ++j){
fgets(line, sizeof(line), inputFile);
//fprintf(fpArray[numOfProcesses-1], "%s", line);
fprintf(fpArray[i], "%s", line);
}
for (i=0; i<(numOfProcesses); ++i ){
fclose(fpArray[i]);
}
fclose(inputFile);
//create processes
for (i=0; i<numOfProcesses; ++i){
processIDs[i] = fork();
if (processIDs[i] < 0)
{
perror ("main():"); //if fork has failed,
//print the reason why it has failed
exit (1); //terminate
}
if (processIDs[i] == 0){
childProcess();
}
//else
//parentProcess(processID);
}//end of create processes
//printf("I am parent process and my pid: %d\n", (int) getpid() );
for (i=0; i<numOfProcesses; ++i){
waitpid(processIDs[i], NULL, 0);
}
/*for(i=0; i<numOfProcesses; ++i){
free (fpArray[i]);
}*/
free (fpArray);
free (processIDs);
exit(0); //the execution shouldn't reach here
//return 0;
}//end of else
}//end of main
void childProcess(void){
//printf("I am a child process and my pid: %d\n", (int) getpid() );
//free (fpArray);
//free (processIDs);
exit(0);
}