当子进程执行execvp时,waitpid没有收到退出状态

时间:2014-10-13 02:41:58

标签: c process fork exit waitpid

我正在尝试创建类似程序的shell。 写了一个示例代码片段程序来查看ls |的执行情况WC。

在示例程序中,主进程为每个命令的执行创建一个子进程(使用execvp)并使用管道传递输出。

但是当我执行程序时,第二个fork()(pid2)的waitpid正在阻塞。 当waitpid存在时,程序不会继续。

如果我评论第二个waitpid(子进程在后台运行并在主程序退出后打印输出),我得到输出。

waitpid的使用有什么问题?为什么它是第一个使用的waitpid而不是第二个waitpid?

注意:1)parse是一个库,它接受输入的输入并将每个命令作为带有args和necesary数据的链表返回。 Parse工作正常

int main(int argc, char *argv[], char *envp[])
{
Pipe p; 
Cmd c;
pipe(lol1);
pipe(lol2); 
pid_t pid,pid2;
int i,status,st;
char *host = "armadillo";
fflush(stdout);
printf("%s%% ", host);
p = parse();
c=p->head;  
printf("1 \n");
pid=fork();
if(pid==0)
{
        dup2(lol1[1],1);
        close(lol1[0]);
        execvp(c->args[0],c->args);


}
else
{
    waitpid(pid,&status,0);

}
printf("2 \n");

c=c->next;
printf("%s \n",c->args[0]);
pid2=fork();
if(pid2==0)
{
    dup2(lol1[0],0);
    close(lol1[1]);
    execvp(c->args[0],c->args);
 }
else
  { 
    printf("just before wait pid \n");
    waitpid(pid2,&st,0);
    close(lol1[0]);
    close(lol1[1]);
  }

}

1 个答案:

答案 0 :(得分:0)

问题在于我在第一个过程中尝试写入的管道。 在第一个过程结束后,我没有关闭管道的写入端。

因此,当第二个进程在管道未关闭时尝试读取管道的读取端时,它将不会收到EOF,因此仍在等待来自管道的输入。

关闭管道的写入端,即添加此行

close(lol1[1]);
pid2=fork();

解决了问题