子进程退出代码!= 0时使用管道

时间:2014-11-10 22:06:23

标签: c

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,每个人都会感到难过。我做错了什么?

3 个答案:

答案 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]。如果我没弄错的话。