2014-10-13 43 views
0

我想创建一个类似程序的shell。 写了一个示例代码片段程序来查看ls |厕所。waitpid没有收到退出状态时,子执行execvp

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

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

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

什么是waitpid函数的使用问题上的第二waitpid函数?为什么它是第一个waitpid工作,而不是第二个waitpid?注:1)parse是一个库,它接受输入类型并将每个命令作为带有args和必需数据的链表返回。解析工作正常

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]); 
    } 

} 
+0

如果你'exec'一个新的进程,但它仍然保持相同的PID,所以当然你仍在等待它......最有可能你想记住两个pid,并在'main'结尾等待 – o11c

回答

0

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

因此,当第二个进程试图读取管道的读取端,因为管道没有关闭,它将不会收到EOF,因此仍然等待来自管道的输入。

关闭管道,即写端加入这一行

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

解决问题