【发布时间】:2012-02-25 03:21:49
【问题描述】:
我正在尝试设置一个程序,该程序使用进程间通信来使用管道/execl 在四个进程之间进行通信。这是演示管道使用的家庭作业问题的一部分,但我在理解它时遇到了一些困难(即进程树如何生长)。这些进程将成为我系统上二进制文件的实例,因此使用 execl。为了简要概述我要完成的工作,我想将标准输入从整个父进程/程序重定向到一个名为“s”的子进程(它是我系统上的一个名为 scan 的二进制文件),它解释单词.在“s”/scan 中,它处理来自其标准输入的单词,然后根据单词,然后将单词发送/写入到一个进程(“e”)或另一个进程(“o”)。 e/o 进程实际上是同一个二进制文件,只是有符号链接到它们——它基本上做同样的事情。
我将如何构建我的调用/父程序来构建它?我必须在这个主程序中创建所有进程,否则我只需在 scan/"s" 进程中创建两个子进程。我在下面有一些代码,我编写了将主程序的标准输入重定向到“s”进程,但我不确定在哪里分叉将连接到它的两个子进程。我认为最好获取除“s”/scan 进程之外我需要创建的其他两个子进程的 pid,并使用不同的 pid 作为参数调用相应的二进制文件,但我不确定。任何帮助将不胜感激!
int s_to_e[2]; int s_to_o[2];
int e_to_s[2]; int o_to_e[2];
pid_t e_pid; pid_t o_pid; pid_t s_pid;
if (pipe(s_to_e)) {
exit(1);
}
if (pipe(s_to_o)) {
exit(1);
}
if ( (s_pid = fork()) == -1) {
fprintf(stderr, "Fork error! \n");
exit(1);
}
int status;
//Child progress of scan
if (s_pid == 0) {
//Redirect stdin to s
//This probably isn't the best way to go about doing this
dup2(0, s_to_e[0]);
close(s_to_e[1]);
//We need to replace the child fork with a new process
if(execl("./scan", "./scan", NULL ) == -1) {
printf("execl Error!");
exit(1);
}
} else {
printf("I am parent\n");
wait(&status);
printf("Done\n");
}
【问题讨论】: