【问题标题】:closing a file descriptor and then using it关闭文件描述符然后使用它
【发布时间】:2013-05-23 15:27:40
【问题描述】:

下面是解释 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;


}

【问题讨论】:

    标签: c unix posix file-descriptor dup2


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果你有两个描述符指向同一个文件,写入这两个描述符会导致输出随机混合;但是您无法检测到任何错误(即写入将成功)来说明任何错误。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2017-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-03-12
          • 1970-01-01
          • 2018-12-02
          • 2011-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多