2016-11-12 54 views
1

如果父进程有两个子进程并且每个子进程都有自己的管道,父进程如何写入每个子进程的管道?有什么办法可以调用一个进程可以指定特定孩子的ID的函数吗?发送数据到子进程

+0

不需要。您必须自己将pid与fd-pair(管道)耦合。 (并且不要忘记每个进程都应该关闭所有不使用的管道文件描述符,否则你将遇到问题,在你需要它们的地方不会得到EOFs)。 – PSkocik

+0

我完全明白你的观点,但我仍然对将pid与fd-pair耦合感到困惑。你是怎样做的?因为我正在做的是我创建一个子进程,使用if-else语句检查fork()的输出,如果有父进程,我创建另一个子进程并重复相同的if-else语句。那么如果它是父进程,我从服务器接收消息。 我想在这里做的是,我想根据一些基本条件,将收到的父进程中的消息发送给子进程。 – zimmer

回答

0

在fork之前,创建一个管道(fd对)。

int pipe_fds[2]; 
if(0>pipe(pipe_fds[2])) /*handle err.*/; 

fork,再有父进程关闭读端和管道的写端保存到pid_to_pipe表:

if(0>(pid = fork())) /*handle err.*/; 

if(pid){ //parent 
    if(0>save_pid_to_pipe(pid, pipe_fds[1])) /*handle err.*/; 
    close(pipe_fds[0]); 
} 

孩子需要关闭的最新写端管:

close(pipe_fds[0]); 

全部写在父母的查找表结束。 然后,它可以等待pipe_fds[0];(读取结束是在创建子时创建的最后一个读取结束)的指令,而父级可以通过查找表通过pid选择相应的写入结束。您可以使用简单数组,排序数组,地图或散列作为查找表。