2011-07-13 107 views
0

我在這裏需要一些澄清: 我有一些像這樣的代碼:在這種情況下,dup2實際上做了什麼?

child_map[0] = fileno(fd[0]); 
.. 
pid = fork(); 
if(pid == 0) 
/* child process*/ 
dup2(child_map[0], STDIN_FILENO); 

現在,將STDIN_FILENO和child_map [0]指向同一個文件描述符?將來的輸入是從child_map [0]和STDIN_FILENO指向的文件中取出的嗎? 我以爲STDIN_FILENO是指標準輸出(終端)。

回答

1

dup2()child_map[0]STDIN_FILENO後,將繼續獨立文件描述符,但他們會指向同一個打開的文件描述。這意味着如果例如child_map[0] == 5STDIN_FILENO == 0,則文件描述符50將在dup2()之後保持打開。

參考相同的打開文件描述意味着文件描述符是可以互換的 - 它們共享像當前文件偏移量這樣的屬性。如果您在一個文件描述符上執行lseek(),則兩者都會更改當前文件偏移量。

要關閉打開的文件說明,全部指向它的文件描述符必須關閉。

dup2()之後執行close(child_map[0])是很常見的做法,只留下一個文件描述符對文件開放。

0

它會導致從stdin讀取從指定的文件描述信息的數據的所有功能,而不是父母的stdin(通常是終端,但可以是一個文件或管道取決於外殼重定向)。

事實上,這是shell如何使用重定向輸入啓動進程。

例如

cat somefile | uniq 

uniq的標準輸入綁定到管道而不是終端。

0

STDIN_FILENOstdin而不是stdout。 (還有一個STDOUT_FILENO。)傳統上,前者爲0,後者爲1.

此代碼使用dup2()從父級打開的另一個文件描述符中重定向子級的stdin。 (它實際上是用於在shell中重定向的基本機制。)之後通常會發生的是其他程序從其stdin讀取exec ed,因此代碼已爲此設置了它的stdin