【发布时间】:2013-11-25 06:00:24
【问题描述】:
缓冲的 IO 流在 fork() 上有一个奇怪的行为。
在下面显示的示例 sn-p 中,正在读取的文件大小为 252 字节。在fork() 之后,孩子正在成功读取一行并在屏幕上打印。但是,当控件返回父进程时,由于某种原因,文件偏移量设置为文件末尾,父进程无法从流中读取任何内容。如果fork() 创建一个文件描述符的副本(使用系统调用read() 和write() 复制相同的程序可以正常工作),人们会期望父进程从流中读取下一行,但事实并非如此'这里似乎没有发生。当控件到达父级时,文件偏移设置为文件末尾。有人可以对此有所了解吗?
int main(void)
{
char buffer[80];
FILE *file;
pid_t pid;
int status;
/* Open the file: */
file = fopen(FILENAME, "r");
if ((pid = fork()) == 0){
fgets(buffer, sizeof(buffer), file);
printf("%s", buffer);
}
else{
waitpid(pid, &status, 0);
printf("Offset [%d]\n", ftell(file));
fgets(buffer, sizeof(buffer), file);
printf("%s", buffer);
}
}
【问题讨论】: