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

C 关闭文件描述符,然后使用它,c,unix,posix,file-descriptor,dup2,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>

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


}
#包括
#包括
#包括
#包括
#包括
int main(){
指出;
out=打开(“out”,O|u WRONLY | O|u TRUNC | O|u CREAT,S|u irsr | S|u IWGRP | S|u IWUSR);
dup2(输出,标准输出文件号);
收尾;
printf(“现在应该将其写入名为out的文件\n”);
返回0;
}

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

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


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

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

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

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

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

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

既然“out”描述符现在已关闭,那么发送到stdout_fileno的消息如何也写入“out”呢

因为在
dup2
之后,
STDOUT\u FILENO
也引用该文件,关闭fd不会关闭其克隆

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

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

既然“out”描述符现在已关闭,那么发送到stdout_fileno的消息如何也写入“out”呢


因为在
dup2
之后,
STDOUT\u FILENO
也引用该文件,关闭fd不会关闭其克隆。

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


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

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

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