2013-12-09 35 views
0

我试图让我的程序在每个孩子的时间(每个行包含一个INT)读取一行。每次我执行这个阅读时,它都会继续阅读第一行。FSEEK FTELL读相同的输入

这里是我的代码的基础。

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; 
    } 
+0

您fseeking到同在所有子进程的文件的开始偏移。如果这不是你想要的,告诉我们你想要什么。 – Fred

+0

即使我认为每次执行阅读时都会增加“告诉”?或者这只会增加对那个孩子的影响? – mschlesinger19

+1

由于(a)每个孩子在不同的(唯一的)文件描述符上操作,并且(b)变量“tell”在每个孩子中是独立的副本,所以它只增加了对每个孩子的讲述。你可以添加一个来告诉其他人(或父母)会知道其中的差异。 – Duck

回答

1

一旦你分岔,每个孩子都有自己的PCB。既然你打开文件后叉,那么每个孩子都有自己独立的文件描述符,偏移等
如果你想子进程共享相同的文件描述符和偏移量,他们必须指向同一个文件描述符内核创建。为此,您必须在之前打开文件
Read here欲了解更多信息。

的孩子继承了打开的文件描述符的父母的一套副本...

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

+0

谢谢!我会试试 – mschlesinger19

+0

如果我想跳过使用这个过程的一行,会发生什么? – mschlesinger19

+0

一旦你分叉,你松散子进程之间的同步性,因为现在的时机是由内核控制的。这意味着对共享资源的操作有点难以预料。如果你愿意,你可以跳过行,但很难保证何时(与其他孩子有关)会发生这种情况。 – EyalAr

相关问题