当子进程从父进程派生出来时,父进程中的所有变量都被复制到新的子进程中。因此,当我们在fork发生之前打开一个公共文件,并尝试从父节点和子节点读取相同的文件时,两者都应该独立打印结果。但是当我试图实现这一点时,从文件中读取父母和孩子似乎是交错的。我想知道为什么会这样。当从父进程派生出一个新进程时,甚至文件描述符也应该被复制。怎么了?
#include<stdio.h>
#include<fcntl.h>
main()
{
int fp;
char buff[11];
int pid;
fp = open("file1.txt", O_RDONLY);
pid = fork();
if(pid==0)
{
printf("Child begins %dn", getpid());
read(fp, buff, 5);
buff[10] = ' ';
printf("Child read:");
puts(buff);
printf("Child exitingn");
}
else
{
read(fp, buff, 5);
buff[10] = ' ';
printf("Parent read:");
puts(buff);
printf("Parent exitingn");
}
}
现在假设file1.txt的内容是"Hello world",那么父进程和子进程都应该打印"Hello"。但是我看到的是其中一个child/parent打印"Hello",另一个打印"world"。
文件描述符是重复的,但是重复的文件指向系统文件表中的相同条目,因此两个进程共享相同的文件指针。内核的read()和writes()都是原子的,所以每个进程在被另一个进程移动后都会看到文件指针。