0

我有以下代码打印到屏幕上:哈哈到文件:

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;
}
4

2 回答 2

1

尝试注释掉scanf(),重新编译并重新运行。尝试读取 EOF 之外的 scanf() 可能正在 stdio 库内部缓冲区中执行某些操作,导致 printf() 缓冲区在进程 _exit 时未刷新此问题。只是猜测...

于 2013-06-23T02:04:37.267 回答
0

文件描述符只有一个位置,用于写入和读取。当您在第 4 行写入文件时,位置将超过刚刚写入的位置,因此描述符的位置位于文件末尾。调用closeandopen具有将位置重置为文件开头的效果(除其他外)。

您可以替换关闭和打开的调用以lseek(fd, 0, SEEK_SET)具有相同的效果,而无需关闭和重新打开文件。

此外,您不应混合使用 stdio 函数和低级函数,scanf例如. 由于 stdio 函数中的缓冲,程序的结果将是不可预测的。printfwrite

于 2013-06-21T17:03:02.520 回答