關閉不需要的文件描述符
我試圖了解管道是如何工作的。此程式碼片段來自某個網站。
所以我對程序的理解是這樣的:
當我們這樣做時
pipe(fd)
(僅假設fd[0]=3
, &一直開放到現在)。現在我們 fork 父級,然後如果沒有創建子級,那麼我們會出錯並退出。fd[0]=4``0``1``2
但如果它的子程序創建成功,文件描述符是否複製到子程序,我的意思是
fd[0]=3
子fd[1]=4
程序也是如此?fd[0]
並且fd[1]
是哪些文件的文件句柄(我們沒有具體指定)?讓我們假設我們希望孩子從父母那裡閱讀,父母應該關閉
fd[0]
,孩子應該關閉fd[1]
,但為什麼呢?如果我們不關閉它們會發生什麼?我不明白On a technical note, the EOF will never be returned if the unnecessary ends of the pipe are not explicitly closed.
。如果父母想從孩子那裡接收數據,它應該關閉fd1,孩子應該關閉fd0。如果父母想給孩子發送數據,它應該關閉fd0,孩子應該關閉fd1。由於描述符在父子節點之間共享,我們應該始終確保關閉我們不關心的管道末端。在技術說明上,如果管道的不必要的末端沒有明確關閉,則永遠不會返回 EOF。
#include <stdio.h> #include <unistd.h> #include <sys/types.h> main() { int fd[2]; pid_t childpid; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } if(childpid == 0) { /* Child process closes up input side of pipe */ close(fd[0]); } else { /* Parent process closes up output side of pipe */ close(fd[1]); } . . }
A
fork
真的是一個叉子。您獲得兩個幾乎相同的過程。主要區別在於fork()
系統呼叫的返回值,它是被標識為父程序的子程序的 pid 和子程序中的 0(這是軟體如何確定哪個程序被視為父程序(父程序具有照顧孩子的責任),哪個是孩子)。特別是,記憶體是重複的,因此
fd
數組將包含相同的內容(如果fd[0]
在一個程序中是 3,那麼在另一個程序中也是 3)並且文件描述符是重複的。子項中的 fd 3 將指向與父項中的 fd 3相同的打開文件描述。所以父母和孩子的 fd 3 都將指向管道的一端,而
fd[1]
父母和孩子的 fd 4 ( ) 將指向另一端。您想將該管道用於一個程序以將數據發送到另一個程序。通常,其中一個程序將寫入 fd 4,而另一個程序將從 fd 3 讀取,直到它看到文件結尾。
當所有打開到管道另一側的 fd 都已關閉時,到達文件末尾。因此,如果閱讀器沒有將其 fd 關閉到另一端,它將永遠不會看到file 的結尾。
同樣,如果讀者死了,作者永遠不會知道如果它沒有關閉自己的 fd 到管道的另一端,它必須停止寫入。