C fseek ftell读取相同的输入

C fseek ftell读取相同的输入,c,fseek,ftell,C,Fseek,Ftell,我试图让我的程序为每个孩子一次读一行(每行包含一个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 handl

我试图让我的程序为每个孩子一次读一行(每行包含一个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;
    }
void forkChildren(int-children){
int i;
整数大小;
整数和=0;
int-tell=0;
pid_t pid;
对于(i=0;i
一旦使用fork,每个子级都有自己的文件。因为在fork之后打开文件,所以每个子级都有自己单独的文件描述符、偏移量等。
如果您希望子进程共享相同的文件描述符和偏移量,它们必须指向内核创建的相同文件描述符。为此,您必须在fork之前打开文件
了解更多信息

子项继承父项的一组打开的文件描述符的副本


在代码中,您尝试使用
int-tell
跟踪文件中的位置,但此变量在子进程之间不是共享的。相反,使用共享文件描述符,内核将为您跟踪偏移量。

您在所有子进程中都是从文件开始到相同的偏移量子进程。如果这不是您想要的,请告诉我们您想要什么。即使我每次执行读取时都在增加“tell”?或者这只会增加该子进程的tell?它只会增加每个子进程的tell,因为(a)每个子进程都在不同(唯一)的文件描述符上操作,(b)变量“tell”在每个子进程中都是一个单独的副本。您可以添加一个来区分其中一个,而其他子进程(或者父进程)将永远不会知道其中的区别。因此,嗯,当多个子进程操作同一个文件时,您在同一个文件上使用3级缓冲io?为什么不(a)使用管道来避免通过文件系统,或者(b)每个子进程使用一个文件?每个子进程都继承自己的私有副本
tell
,但这意味着它们都共享父进程的默认值0。谢谢!我将尝试解决如果我想使用此进程跳过一行会发生什么情况?一旦分叉,子进程之间就会失去同步性,因为现在时间由ker控制这意味着共享资源上的操作有些不可预测。如果愿意,您可以跳过行,但很难保证何时(相对于其他子项)会发生这种情况。