C 为什么dup2可以在这里工作?

C 为什么dup2可以在这里工作?,c,linux,kernel,dup2,C,Linux,Kernel,Dup2,我从APUE得到了这段代码片段 if (dup2(clfd, STDOUT_FILENO) != STDOUT_FILENO || dup2(clfd, STDERR_FILENO) != STDERR_FILENO) { syslog(LOG_ERR, "ruptimed: unexpected error"); exit(1); } 它将所有输出、stderr和stdout重定向到远程套接字,远程套接字可通

我从APUE得到了这段代码片段

if (dup2(clfd, STDOUT_FILENO) != STDOUT_FILENO ||
          dup2(clfd, STDERR_FILENO) != STDERR_FILENO) {
            syslog(LOG_ERR, "ruptimed: unexpected error");
            exit(1);
        }
它将所有输出、stderr和stdout重定向到远程套接字,远程套接字可通过clfd写入

但这怎么行呢?您正在将两个FD重定向到一个FD

但这怎么行呢?您正在将两个FD重定向到一个FD

这没问题。说:

dup2()
函数应使文件描述符
fildes2
引用 与文件描述符
fildes
相同的打开文件描述。如果 fildes2已是有效的打开文件描述符,应将其关闭 首先

在任何时候,它都没有提到多个描述符引用同一个目的地是非法的


内核只需将进程中的多个文件描述符指向系统范围的open file表中的同一条目。

我很难想象为什么您会认为这是一个问题。它与将p同时存储到q和r中没有什么不同。事实上,由于
dup2
的作用,在
dup2
返回时,总会有至少两个文件描述符引用相同的打开文件描述。
int dup2(int fildes, int fildes2);