int cpipe[2];
if(-1==pipe(cpipe)) {
printf("Pipe failed");
exit(1);
}
// Fork printenv
childPID=fork();
if(-1==childPID) {
printf("Fork failed");
exit(1);
}
else if (0==childPID) {
// if(-1==dup2(cpipe[1],1)); {
// printf("Pipe failed");
// exit(1);
// }
// close(cpipe[0]);
// close(cpipe[1]);
execl("/usr/bin/printenv","printenv",0);
printf("Execl failed");
_exit(1);
}
wait(&childExitStatus);
printf("\n%d \n",childExitStatus);
if(childExitStatus!=0) {exit(1);}
以上代码有效;给childExitStatus = 0,大家都很开心。因为我希望printenv的输出写入管道而不是在屏幕上打印,所以我放入了当前评论的部分。然而,退出该部分会给出退出代码256,每个人都会感到难过。我做错了什么?
答案 0 :(得分:1)
我设法在子进程中使用dup
而不是dup2
来使其工作。原始代码始终在dup2
失败(我更改了每个特定错误的退出状态)。但我不知道为什么。
} else if (childPID == 0) {
close(1);
dup(cpipe[1]);
...
}
我还在父进程中添加了cpipe[0]
的阅读,只是为了测试:
char c[4096];
write(1, c, read(cpipe[0], c, 4096));
close(cpipe[0]);
int childExitStatus;
wait(&childExitStatus);
printf("\n%d \n", childExitStatus);
if (childExitStatus != 0)
_exit(5);
答案 1 :(得分:1)
你的专栏:
if(-1==dup2(cpipe[1],1)); {
分号错位。将上面的行更改为:
if(-1==dup2(cpipe[1],1)){
你应该看到正确的返回值。
总是在if语句中调用 exit(1)
,因为if语句以分号结束,并且大括号内的代码总是被执行。
答案 2 :(得分:-1)
尽量不写:
close(cpipe[1]);
因为printenv关闭了cpipe [1]。如果我没弄错的话。