我正试图让我的程序每次为每个孩子读取一行(每行包含一个int)。每次我读这个时,它都会一直读第一行。
这是我的代码的基础。
void forkChildren (int nChildren) {
int i;
int size;
int sum = 0;
int tell = 0;
pid_t pid;
for (i = 0; i < nChildren; i++) {
pid = fork();
if (pid == -1) {
/* error handling here, if needed */
return;
}
if (pid == 0) {
char data[10];
FILE * file1;
file1 = fopen("numbers.dat", "r");
fseek(file1, tell, SEEK_SET);
fgets(data, 10, file1);
//fseek(file1, tell, SEEK_SET);
tell += strlen(data);
printf("%d ", tell);
sum = atoi(data);
printf("Sum is: %d n", sum);
sleep (5);
return;
}
分叉后,每个子级都有自己的PCB。由于您在叉之后打开文件,因此每个子级都有自己单独的文件描述符、偏移量等。
如果您希望子进程共享相同的文件描述符和偏移量,它们必须指向内核创建的相同文件描述符。为此,您必须在分叉之前打开文件。
请阅读此处了解更多信息。
子项继承父项的打开文件描述符集的副本。。。
在您的代码中,您试图通过使用int tell
来跟踪文件中的位置,但该变量在子进程之间是而不是共享的。相反,使用共享文件描述符,内核将为您跟踪偏移量。