0

プログラムのようなシェルを作成しようとしています。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]);
  }

}
4

1 に答える 1

0

問題は、最初のプロセスで書き込もうとしていたパイプにありました。最初のプロセスが終了した後、パイプの書き込み側を閉じませんでした。

したがって、パイプが閉じていないため、2 番目のプロセスがパイプの読み取り側を読み取ろうとすると、EOF を受信しないため、パイプからの入力を待機します。

パイプの書き込み側を閉じます。つまり、この行を追加します

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

問題を解決しました

于 2014-10-13T20:13:58.963 に答える