我有fork了多次父進程。我在程序開始時管道一次,然後分叉多次。我是否可以在所有孩子中使用相同的文件描述符來寫入父級?或者我必須爲每個新的孩子鋪設管道,併爲每個孩子分別提供一個文件描述符?管叉:跨多個孩子共用一個文件描述符
截至目前,第一個孩子可以寫入管道寫端沒有問題,但第二個孩子時,它嘗試寫入得到一個壞的文件描述符的錯誤。
的代碼寫在所有的孩子一樣。
我有fork了多次父進程。我在程序開始時管道一次,然後分叉多次。我是否可以在所有孩子中使用相同的文件描述符來寫入父級?或者我必須爲每個新的孩子鋪設管道,併爲每個孩子分別提供一個文件描述符?管叉:跨多個孩子共用一個文件描述符
截至目前,第一個孩子可以寫入管道寫端沒有問題,但第二個孩子時,它嘗試寫入得到一個壞的文件描述符的錯誤。
的代碼寫在所有的孩子一樣。
所以我是一個傻瓜。當我進入程序時,我分叉了一次,關閉了父級管道的寫入端,然後再次分叉,爲任何後來的孩子提供封閉的寫入結束。
pipe(fd);
pid = fork();
if (!pid) { /* Insert first child code */ }
else {
close(fd[1]); /* Close write end of pipe */
pid = fork(); /* Fork again. */
/* ... */
}
但是,當它試圖寫入第二個孩子得到一個壞文件描述符錯誤。
當然,因爲每個新進程都需要打開新文件來處理纔有效。 剛打開管道爲每個新工藝
#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);
}
}
當你發現,你可以完全共享跨越fork'ed工藝管道的FD - 那麼這取決於你如何寫數據,如果多個進程寫入同一管道的數據可能會混到 - - 根據通信的目的,這可能會或可能不會導致問題。 – Soren 2014-09-28 13:02:22
謝謝。該計劃是一個學校項目的模擬調度程序,向我們展示基本的信號。一次只能運行一個過程,因此不會出現競賽狀況。 – ReX357 2014-09-28 13:08:37