文件描述符表 - 父/子共享它

时间:2014-11-10 08:11:32

标签: c unix posix

我正在尝试创建一个示例(以帮助我理解以下概念):

子进程继承其父进程的打开文件。 这可以在此图http://www.cs.ucsb.edu/~rich/class/cs170/notes/FileSystem/filetable.rich.jpg

中看到

这是我的代码:

 FILE* f = fopen("test.txt", "r");

 if(fork()==0){

    printf("%c",  fgetc(f) ); //should print e
    printf("%c",  fgetc(f) ); //should print s
    printf("%c",  fgetc(f) ); //should print t
    printf("\n");
 } else {
    printf("%c",  fgetc(f) ); // print t

 }

test.txt包含单词test

假设父运行第一,如果父和子具有相同的描述符表,则系统不应输出t(from parent)est(from children)。目前输出为t▒▒▒▒

感谢 丹尼尔

1 个答案:

答案 0 :(得分:2)

C stdio库使用缓冲来提高效率。即使您只读取一个字符,fgetc函数也会从文件中读取整个缓冲区。对于这样一个小文件,这意味着首先安排的进程完全读取它。

您可以通过拨打setvbuf来禁用缓冲。或者,您可以使用直接对文件描述符进行操作的函数(openread)。