当子进程从父进程分叉时,父进程中的所有变量都将复制到新的子进程。因此,当我们在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 %d\n", getpid());
read(fp, buff, 5);
buff[10] = '\0';
printf("Child read:");
puts(buff);
printf("Child exiting\n");
}
else
{
read(fp, buff, 5);
buff[10] = '\0';
printf("Parent read:");
puts(buff);
printf("Parent exiting\n");
}
}
现在假设file1.txt的内容为“Hello world”,那么父进程和子进程都应该打印“Hello”。但我所看到的是儿童/父母印刷品中的一个“Hello”,另一个印刷品是“世界”。
答案 0 :(得分:1)
文件描述符是重复的,但重复项指向系统文件表中的SAME条目,因此这两个进程共享相同的文件指针。内核read()和write()是原子的,因此每个进程在被另一个进程移动后都会看到它。