我尝试将三个进程相互管道化。然而,我真的很困惑,分叉第三个过程。分叉和管道只有两个进程可以正常工作。当我添加+1循环来测试第三个进程是否会产生时,我在终端中得到了奇怪的结果。
这是我的代码(结果很奇怪):
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main(){
int status, i;
int pip[2];
/* Spawn 3 subprocesses and pipe the first 2*/
for (i=0; i<3; i++){
if (i==0) pipe(pip);
if (fork()==0){
/* First subprocess */
if (i==0){
dup2(pip[1], 1); //pip[0] will replace stdout
close(pip[0]);
if (execlp("ls", "ls", NULL)) perror("process1");
}
/* Second subprocess */
if (i==1){
dup2(pip[0], 0); //pip[1] -> will replace stdin
close(pip[1]);
if (execlp("more", "more", NULL)) perror("process2");
}
/* Third subprocess */
if (i==2){
close(pip[0]); //reseting fd
close(pip[1]); //reseting fd
open(0); //reseting fd
open(1); //reseting fd
if (execlp("ls", "ls", NULL)) perror("process3");
}
}
}
wait(&status);
return 0;
}
将for循环更改为2循环而不是3循环会阻止奇怪的行为。 奇怪的行为是随机我将在终端中获得其中一个输出:
manos@megistanas:~/Desktop/test$ ./test
test test2.c test3.c test4.c test.5c test.c
test
test2.c
test3.c
test4.c
test.5c
test.c
manos@megistanas:~/Desktop/test$
在这种情况下,它正常工作。现在在某些方面它是这样的:
manos@megistanas:~/Desktop/test$ test
test2.c
test3.c
test4.c
test.5c
test.c
test test2.c test3.c test4.c test.5c test.c
manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$ manos@megistanas:~/Desktop/test$
点击输入只是写入提示并等待更多输入。第三个奇怪的行为是:
manos@megistanas:~/Desktop/test$ test
test2.c
test3.c
test4.c
test.5c
test.c
(blinking prompt symbol)
一旦我点击进入,程序就会正常结束。有人可以解释发生了什么吗?
答案 0 :(得分:3)
开(0);
开(1);
请阅读man page for open(2)。
提示:它不需要一个参数。您应该使用-Wall
构建,并注意编译器警告。
这可能并不能完全解释你所看到的,但鉴于这个明显的错误,我懒得再看了。