【问题标题】:behavior of filedescriptor in fork()fork() 中文件描述符的行为
【发布时间】:2011-10-13 15:27:01
【问题描述】:

当子进程从父进程派生时,父进程中的所有变量都将复制到新的子进程中。因此,当我们在分叉发生之前打开一个公共文件,并尝试从父级和子级读取同一个文件时,两者都应该独立打印结果。但是当我尝试实现这一点时,从文件中读取父母和孩子似乎是交错的。需要知道为什么会发生这种情况。当从父进程派生新进程时,甚至文件描述符也应该被复制。那怎么了?

#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”。但我看到的是孩子/父母打印“你好”和另一个打印“世界”中的一个。

【问题讨论】:

    标签: file-descriptor


    【解决方案1】:

    文件描述符重复,但重复指向系统文件表中的相同条目,因此两个进程共享相同的文件指针。内核 read()'s 和 writes()'s 是原子的,所以每个进程在被另一个进程移动后都会看到文件指针。

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 2012-10-16
      • 2015-07-25
      • 2011-05-15
      • 1970-01-01
      • 2012-07-28
      • 2014-02-15
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多