2013-05-28 61 views
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

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

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

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

因为dup2STDOUT_FILENO指文件后的欢迎,并关闭一个FD不会关闭它的克隆。

+0

谢谢。这解释了它 – DesirePRG

0

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

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

正如其他答案所说,一般来说,最好只打开一个文件描述符,因为它既减少了程序使用的资源数量,也更容易看到您正在使用相同的文件。 (例如,你可以有一个问题写在一个循环从文件中读取)

0

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

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

相关问题