2014-09-28 107 views
1

我有fork了多次父進程。我在程序開始時管道一次,然後分叉多次。我是否可以在所有孩子中使用相同的文件描述符來寫入父級?或者我必須爲每個新的孩子鋪設管道,併爲每個孩子分別提供一個文件描述符?管叉:跨多個孩子共用一個文件描述符

截至目前,第一個孩子可以寫入管道寫端沒有問題,但第二個孩子時,它嘗試寫入得到一個壞的文件描述符的錯誤。

的代碼寫在所有的孩子一樣。

+0

當你發現,你可以完全共享跨越fork'ed工藝管道的FD - 那麼這取決於你如何寫數據,如果多個進程寫入同一管道的數據可能會混到 - - 根據通信的目的,這可能會或可能不會導致問題。 – Soren 2014-09-28 13:02:22

+0

謝謝。該計劃是一個學校項目的模擬調度程序,向我們展示基本的信號。一次只能運行一個過程,因此不會出現競賽狀況。 – ReX357 2014-09-28 13:08:37

回答

0

所以我是一個傻瓜。當我進入程序時,我分叉了一次,關閉了父級管道的寫入端,然後再次分叉,爲任何後來的孩子提供封閉的寫入結束。

pipe(fd); 
pid = fork(); 

if (!pid) { /* Insert first child code */ } 
else { 

    close(fd[1]); /* Close write end of pipe */ 

    pid = fork(); /* Fork again. */ 
    /* ... */ 

} 
1

但是,當它試圖寫入第二個孩子得到一個壞文件描述符錯誤。

當然,因爲每個新進程都需要打開新文件來處理纔有效。 剛打開管道爲每個新工藝

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

#include <sys/stat.h> 
#include <sys/types.h> 

#include <fcntl.h> 
char str1[] = "string from 1-st proc"; 
char str2[] = "string from 2-st proc"; 
int main(int argc, char *argv[]) 
{ 
    char buf[100]; 
    mkfifo("/tmp/my_fifo", 0777); 
    if (fork() == 0) { 
     //it is child 
     int pipe_chld = open("/tmp/my_fifo", O_WRONLY); 
     write(pipe_chld, str1, sizeof(str1)); 
     if (fork() == 0) { 
      //it is child 
      int pipe_chld = open("/tmp/my_fifo", O_WRONLY); 
      write(pipe_chld, str2, sizeof(str2)); 
      exit(0); 
     } else { 
      exit(0); 
     } 
    } else { 
     //it is parent 
     int fd_fifo = open("/tmp/my_fifo", O_RDONLY); 
     read(fd_fifo, buf, 100); 
     read(fd_fifo, buf + sizeof(str1), 100); 
     printf("%s, %s\n", buf, buf + sizeof(str1)); 
     exit(0); 
    } 
} 
+0

其實我剛解決這個問題,我不需要一個新的管道。一旦我分叉了一次,我就關閉了父母的管道寫端,因此任何進一步的分叉都爲孩子提供了封閉的一端。 – ReX357 2014-09-28 12:49:04

+0

你不需要新的管道,你需要重新打開舊管爲每個新工藝 – 2014-09-28 12:50:43

+2

不能重新打開一個封閉的管道。一旦關閉,關閉。事實上,你會如何做到這一點?開放系統調用不會將文件描述符作爲參數。 – ReX357 2014-09-28 12:55:17