我正在尝试使用递归分支系统创建一个包含800个int的数组的mergesort,以便每个最底层的子项(总共8个)每个qsort 100,然后将数组传递回各自的父进程合并排序并再次传递。
由于某种原因,在第一组最底层的孩子完成写入父进程后,该函数挂起。
我的递归fork函数,它接受初始数组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));
}
答案 0 :(得分:3)
您的代码出现了一些问题(我必须补充说,这很有趣)。
A)你应该退出()而不只是返回客户端代码。否则,您将继续执行,尤其是当您进行递归时。
B)您需要将管道的写入端传递给客户端,以便他们知道在哪里写入。我将此作为参数添加到forkSort()。
C)当尺寸<= 100时,你做sizeof(parentNums)
这变为sizeof(int*)
,正确的方法是:sizeof(int)*size
。
D)当您回写一组合并的int时,您只需编写第一部分并将其写入管道的读取端。正确的电话会是:write(write_fd, combined, sizeof(combined));
。
E)我删除了等待(NULL)调用,因为我没有看到这一点。同步将由read()
和write()
来电完成。
这是我的建议:
static void forkSort(int* parentNums, int size, int write_fd)
{
int fd[2];
printf("PPid:%ld Pid:%ld Size:%d\n", (long)getppid(), (long)getpid(), size);
int childNums[size/2], left, right;
if(size <= 100) //Send sorted array to parent thru pipe
{
qsort(parentNums, size, sizeof(int), compare);
write(write_fd, parentNums, size*sizeof(int));
exit(0);
}
if (pipe(fd)==-1){perror("Failed");}
printf("Creating child processes...\n");
size /= 2;
if(!(left = tryFork()) || !(right = tryFork())) //Children
{
if(left) copy(childNums, parentNums, size);
else copy(childNums, parentNums + size, size);
forkSort(childNums, size, fd[1]);
}
/* parent */
int first[size], second[size], combined[size*2];
read(fd[0], first, sizeof(first));
read(fd[0], second, sizeof(second));
printf("\n\nMerge sorting... Size:%d\n", size*2);
mergeSort(first, second, combined, size);
if(size*2 == SIZE) { //Finished, write to out.dat
printf("\nFinished!!! (%d)\n\n", size * 2);
printArray(combined, SIZE);
}
else {
write(write_fd, combined, sizeof(combined));
exit(0);
}
}