C 为什么dup2可以在这里工作?
我从APUE得到了这段代码片段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重定向到远程套接字,远程套接字可通
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);