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]);
}
}
如果你'exec'一个新的进程,但它仍然保持相同的PID,所以当然你仍在等待它......最有可能你想记住两个pid,并在'main'结尾等待 – o11c