我正在尝试创建一个示例(以帮助我理解以下概念):
子进程继承其父进程的打开文件。 这可以在此图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▒▒▒▒
。
感谢 丹尼尔
答案 0 :(得分:2)
C stdio库使用缓冲来提高效率。即使您只读取一个字符,fgetc
函数也会从文件中读取整个缓冲区。对于这样一个小文件,这意味着首先安排的进程完全读取它。
您可以通过拨打setvbuf
来禁用缓冲。或者,您可以使用直接对文件描述符进行操作的函数(open
,read
)。