私の最後の質問(複数の子プロセス)を参照して、私は現在、複数の子プロセスを使用して外部ソーティングの実装を作成しようとしています。
...
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が含まれている場合、次のように出力されます。
(1番目の子)1 4 5
(2番目の子)1 4 5
(2つの子プロセスを使用)。fscanfは入力ストリームの先頭から整数の読み取りを開始するため。
今の私の問題は、前の子プロセスが残った時点からどのように数字を読み続けることができるかということです。たとえば、入力ファイルに5 1 4 8 5 10が含まれている場合、次のように出力できます。
(最初の子供)1 4 5
(2番目の子供)5 8 10
前もって感謝します;)