【问题标题】:opening descriptor and closing , why does it matter?打开描述符和关闭,为什么重要?
【发布时间】:2013-06-21 15:52:39
【问题描述】:

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

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

【问题讨论】:

  • 删除第 6 行和第 7 行会得到什么不同的结果?
  • 文件中没有任何内容:哈哈

标签: c file-descriptor dup


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    此外,您不应混合使用标准输入输出函数 scanfprintf 和低级函数,例如 write。由于 stdio 函数中的缓冲,程序的结果将是不可预测的。

    【讨论】:

    • 好的,谢谢,现在明白为什么没有输出到屏幕了。但是为什么文件只包含单词 haha​​h 而不是:haha hello Father finished ?
    • 在我的测试中它确实包含“哈哈你好父亲完成”。您可能会得到不同的结果;像这样将 stdio 与低级 io 混合会导致不可预测的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多