关闭文件描述符然后使用它

时间:2013-05-28 15:23:41

标签: c unix posix file-descriptor dup2

以下是解释dup2系统调用的代码段。我不明白的是,在复制两个文件描述符之后,为什么我们需要关闭旧的文件描述符。由于现在关闭“out”描述符,发送到stdout_fileno的消息如何也被写入“out”。请注意,代码不是由我编写的。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(){

    int out;
    out=open("out",O_WRONLY | O_TRUNC | O_CREAT,S_IRUSR|S_IRGRP | S_IWGRP | S_IWUSR);

    dup2(out,STDOUT_FILENO);
    close(out); 
    printf("now this should be written to a file called out \n");
    return 0;


}

3 个答案:

答案 0 :(得分:4)

  

为什么我们需要关闭旧的文件描述符

你真的不需要;这个例子主要表明你可以。但是,Unix系统上的每个进程都可以使用有限数量的文件描述符,当你有两个引用同一个文件时,其中一个是不必要的,所以你可以关闭它。

  

由于“out”描述符现在已关闭,发送到stdout_fileno的消息如何被写入“out”。

因为在dup2之后,STDOUT_FILENO也引用了该文件,并且关闭fd不会关闭其克隆。

答案 1 :(得分:0)

stdout,stdin,stderr,是* nix系统中的所有文件。您可以将您的代码视为取出文件的“指针”,并将stdout设置为指向此文件。此时,可以删除第一个“指针”。这也是它使用prinft()的原因;而不是fprintf();

您不需要关闭旧文件描述符,但代码可能是一个示例,表明您可以。

正如其他两个答案所说,一般来说,最好只打开一个文件描述符,因为它既减少了程序使用的资源量,又更容易看到你正在使用同一个文件。 (例如,你可能在循环中写入和读取该文件时遇到问题)

答案 2 :(得分:0)

如果有两个描述符指向同一个文件,则写入两个描述符会导致输出随机混合;但是没有错误你可以检测到(即写入会成功)告诉任何事情是错的。

如果检查返回值,则可以轻松检测到写入已关闭文件描述符的尝试,因此最好关闭不使用的文件描述符,而不是保留它并小心不要触摸它。