我試圖設置一個程序,使用管道/ execl使用進程間通信在四個進程之間進行通信。這是演示使用管道的作業問題的一部分,但我在圍繞它的過程中遇到了一些困難(即過程樹如何增長)。這些進程是我的系統上的二進制文件的實例,因此使用execl。爲了簡要概述我想要完成的工作,我想將stdin從整個父進程/程序重定向到稱爲「s」的子進程(這是我的系統中稱爲掃描的二進制文件),它將字。在「s」/ scan中,它處理來自stdin的單詞,然後根據單詞將單詞發送/寫入一個進程(「e」)或另一個進程(「o」)。 e/o進程實際上是相同的二進制文件,只是具有符號鏈接 - 它基本上是一樣的。如何在管道/ execl的4個進程之間建立進程間通信的最佳結構?
我該如何去構建我的調用/父程序來構造它?我必須在這個主程序中創建所有進程,否則我只是在掃描/「s」進程中創建兩個子進程。我在下面有一些代碼,我寫了將主程序的stdin重定向到「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");
}