0

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


}
4

3 回答 3

4

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

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

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

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

于 2013-05-28T15:28:24.123 回答
0

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

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

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

于 2013-05-28T15:25:43.767 回答
0

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

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

于 2013-05-28T15:36:38.030 回答