1
如果父进程有两个子进程并且每个子进程都有自己的管道,父进程如何写入每个子进程的管道?有什么办法可以调用一个进程可以指定特定孩子的ID的函数吗?发送数据到子进程
如果父进程有两个子进程并且每个子进程都有自己的管道,父进程如何写入每个子进程的管道?有什么办法可以调用一个进程可以指定特定孩子的ID的函数吗?发送数据到子进程
在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选择相应的写入结束。您可以使用简单数组,排序数组,地图或散列作为查找表。
不需要。您必须自己将pid与fd-pair(管道)耦合。 (并且不要忘记每个进程都应该关闭所有不使用的管道文件描述符,否则你将遇到问题,在你需要它们的地方不会得到EOFs)。 – PSkocik
我完全明白你的观点,但我仍然对将pid与fd-pair耦合感到困惑。你是怎样做的?因为我正在做的是我创建一个子进程,使用if-else语句检查fork()的输出,如果有父进程,我创建另一个子进程并重复相同的if-else语句。那么如果它是父进程,我从服务器接收消息。 我想在这里做的是,我想根据一些基本条件,将收到的父进程中的消息发送给子进程。 – zimmer