gpt4 book ai didi

c - 多个子进程+从流中读取

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:35 25 4
gpt4 key购买 nike

关于我的上一个问题(Multiple child process),我现在正在尝试使用多个子进程进行外部排序。

...
fp = fopen(pathname, "r"); // open inputfile in r mode
fgets(trash, 10, fp); // ignore first line

for (i=0; i<numberOfProcess; ++i) {
#ifdef DBG
fprintf(stderr, "\nDBG: Calling fork()\n");
#endif

if ((pids[i] = fork()) < 0) {
perror("fork error");
exit(EXIT_FAILURE);

} else if (pids[i] == 0) { // Child Code

if (numbersToSort % numberOfProcess == 0) { // 16 % 4 = 0
partialDataSize = numbersToSort / numberOfProcess;

for (j=0; j<partialDataSize; j++) {
fscanf(fp, "%d", &arrayPartialData[j]);
qsort(arrayPartialData, partialDataSize, sizeof(int), (void *)comp_num);

//printf("%d\n", arrayPartialData[j]);
// TODO: qsort data until partialDataSize
}

}
printf("pid: %d child process %d outputs: ", getpid(), pids[i]);
printArray(arrayPartialData, partialDataSize);
//break;
exit(0);
}
}

/* Wait for children to exit. */

while (numberOfProcess > 0) {
pid = wait(&status);
--numberOfProcess;
}

fclose(fp);

当然,由于 fscanf,此代码从输入文件输出相同的排序整数序列。例如,如果输入文件的开头包含 5 1 4,则它输出:

(第一个 child )1 4 5
(第二个 child ) 1 4 5

(有两个子进程)..因为 fscanf 开始从输入流的开头读取整数。

我现在的问题是如何从前一个子进程离开的地方开始继续读取数字?例如,如果输入文件包含 5 1 4 8 5 10,那么它可以输出:

(第一个 child )1 4 5

(第二个 child )5 8 10

提前致谢;)

最佳答案

我会使用较低级别的 open() 和 read() 而不是等效的流,否则您将不得不担心 stdio 缓冲区与底层文件描述符的同步问题。请注意,您在读取完整数字时仍然会遇到问题,因此您可能需要在进程之间进行一些同步。

作为替代方案,我建议使用单个进程来读取文件并将行的子集写入进行排序的子进程(使用 pipe()),然后它们将其写入另一个进行合并的进程。

关于c - 多个子进程+从流中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/878494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com