プログラムのようなシェルを作成しようとしています。ls | の実行を確認するためのサンプル スニペット プログラムを作成しました。トイレ。
サンプル プログラムでは、メイン プロセスは、(execvp を使用して) 各コマンドを実行するための子プロセスを作成し、パイプを使用して出力を渡します。
しかし、プログラムを実行すると、2 番目の fork() (pid2) の waitpid がブロックされます。waitpid が存在する場合、プログラムは続行されません。
2 番目の waitpid にコメントを付けると、出力が得られます (子プロセスはバックグラウンドで実行されており、メイン プログラムの終了後に出力を出力しています)。
waitpid の使用における問題は何ですか? 最初の waitpid が機能しているのに、2 番目の waitpid が機能していないのはなぜですか?
注:1) 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]);
}
}