Linux

關閉不需要的文件描述符

  • August 21, 2018

我試圖了解管道是如何工作的。此程式碼片段來自某個網站。

所以我對程序的理解是這樣的:

當我們這樣做時pipe(fd)(僅假設fd[0]=3, &一直開放到現在)。現在我們 fork 父級,然後如果沒有創建子級,那麼我們會出錯並退出。fd[0]=4``0``1``2

但如果它的子程序創建成功,文件描述符是否複製到子程序,我的意思是fd[0]=3fd[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]);
           }
           .
           .
   }

Afork真的是一個叉子。您獲得兩個幾乎相同的過程。主要區別在於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 到管道的另一端,它必須停止寫入。

引用自:https://unix.stackexchange.com/questions/132325