再帰フォークのシステムを使用して800intの配列をマージソートで作成しようとしています。これにより、最下位の子(合計8つ)のそれぞれがそれぞれ100をqsortし、配列をそれぞれの親プロセスに戻してマージします。ソートされ、再び渡されました。
なんらかの理由で、最下位の子の最初のセットが親プロセスへの書き込みを終了した後、関数がハングします。
800の初期配列を受け取る私の再帰フォーク関数...
static void forkSort(int* parentNums, int size)
{
printf("PPid:%ld Pid:%ld Size:%d\n", (long)getppid(), (long)getpid(), size);
int childNums[size/2], fd[2], left, right;
if(size <= 100) //Send sorted array to parent thru pipe
{
qsort(parentNums, size, sizeof(int), compare);
write(fd[1], &parentNums, sizeof(parentNums));
exit(0);
}
if (pipe(fd)==-1){perror("Failed");}
size /= 2;
if(!(left = tryFork()) || !(right = tryFork())) //Children
{
if(left) copy(childNums, parentNums, size);
else copy(childNums, parentNums + size, size);
forkSort(childNums, size);
}
//Parents
int first[size], second[size], combined[size*2];
read(fd[0], first, sizeof(first));
read(fd[0], second, sizeof(second));
mergeSort(first, second, combined, size);
if(size*2 == SIZE) //Finished, write to out.dat
printArray(combined, SIZE);
else
write(fd[0], combined, sizeof(combined));
}