【问题标题】:Send data to child processes向子进程发送数据
【发布时间】:2016-11-12 22:02:19
【问题描述】:

如果父进程有两个子进程并且每个子进程都有自己的管道,那么父进程如何写入每个子进程的管道?有什么方法可以调用一个函数,一个进程可以指定一个特定的孩子的 id?

【问题讨论】:

  • 没有。您必须自己将 pid 与 fd 对(管道)耦合。 (并且不要忘记每个进程都应该关闭它不使用的所有管道文件描述符,否则你会遇到问题不会在你需要的地方获得 EOF)。
  • 我完全明白你的意思,但我仍然对将 pid 与 fd-pair 耦合感到困惑。你是怎样做的?因为我正在做的是创建一个子进程,使用 if-else 语句检查 fork() 的输出,如果有父进程,我创建另一个子进程并重复相同的 if-else 语句。然后,如果它是父进程,我会收到来自服务器的消息。我在这里要做的是,我想根据一些基本条件,将父进程收到的消息发送给子进程。

标签: c pipe fork


【解决方案1】:

在你分叉之前,创建一个管道(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];上的指令(在创建child时是最新的读取端),而父级可以通过查找表通过pid选择相应的写入端。

您可以为查找表使用简单数组、排序数组、映射或散列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 2012-05-16
    相关资源
    最近更新 更多