2012-08-07 106 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

相關問題