我有以下代码 它打印到屏幕上:哈哈 到文件:
haha
hello
Father finished
如果我删除第6行和第7行,我会得到不同的结果 为什么?
int main()
{
// creates a new file having full read/write permissions
int fd = open("myfile", O_RDWR|O_CREAT, 0666);
write(fd, "haha\n", 5);
close(fd); // line 6
fd = open("myfile", O_RDWR); // line 7
close(0);
close(1);
dup(fd);
dup(fd);
if (fork() == 0)
{
char s[100];
dup(fd);
scanf("%s", s);
printf("hello\n");
write(2, s, strlen(s));
return 0;
}
wait(NULL);
printf("Father finished\n");
close(fd);
return 0;
}
答案 0 :(得分:1)
尝试注释掉scanf(),重新编译并重新运行。尝试超出EOF读取的scanf()可能在stdio库内部缓冲区中执行某些操作,导致printf()缓冲区中的此问题在进程_exit时未被刷新。只是一个猜测...
答案 1 :(得分:0)
文件描述符只有一个用于写入和读取的位置。当您在第4行写入文件时,位置超出刚刚写入的位置,因此描述符的位置位于文件的末尾。调用close
和open
会将位置重置为文件的开头(以及其他内容)。
您可以使用lseek(fd, 0, SEEK_SET)
替换要关闭和打开的调用以获得相同的效果,而无需关闭并重新打开文件。
此外,您不应混合使用stdio函数scanf
,printf
和低级函数,例如write
。由于stdio函数中的缓冲,程序的结果将是不可预测的。