2012-08-07 104 views
0

我从APUE这个代码片段,为什么dup2能在这里工作?

if (dup2(clfd, STDOUT_FILENO) != STDOUT_FILENO || 
      dup2(clfd, STDERR_FILENO) != STDERR_FILENO) { 
      syslog(LOG_ERR, "ruptimed: unexpected error"); 
      exit(1); 
     } 

这将重定向所有输出,标准错误和标准输出到远程套接字,这是通过clfd写。

但是,这是如何工作的?你将两个FD重定向到一个FD。

+0

我很难想象为什么你会认为这是一个问题。将p存储到q和r中并没有什么不同。 – 2012-08-07 09:50:22

回答

1

但是这怎么能工作?您将两个FD重定向到一个单独的一个

这没有问题。 The standard说:

int dup2(int fildes, int fildes2); 

dup2()功能须安排的文件描述符fildes2指 相同的打开文件描述的文件描述符fildes。如果 fildes2已经是一个有效的打开文件描述符,它应该先关闭 。

在任何时候它都没有提及任何关于涉及同一目的地的多个描述符是非法的。

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

+0

事实上,由于'dup2'的作用,在'dup2'返回的时刻**总是**至少有两个文件描述符引用相同的打开文件描述。 – 2012-08-07 13:31:44