1

割り当てのために、リダイレクトとパイプを備えた基本的なシェルを実装する必要があります。パイプのコードはプログラムを終了し、ユーザー入力を再度要求しません。パイプは関数で実行されるため、基本的に制御はメインに戻されません。どうすればそうさせることができますか?これが私のコードです:

void execute_pipe(char **argv,char **args)
{

    int pfds[2];
    pid_t pid;
    int status;
    pipe(pfds);
    if ((pid = fork()) < 0) {    
          printf("*** ERROR: forking child process failed\n");
          exit(1);
     }
    printf("here");
    if (pid==0) {
        close(1);      
        dup(pfds[1]);   
        close(pfds[0]); 
           if(execvp(argv[0],argv)<0){
            printf("**error in exec");

        }

    } 
    else {
    while (wait(&status) != pid)  ;  
        close(0);      
        dup(pfds[0]);   
        close(pfds[1]); 

           if(execvp(args[0],args)<0){
            printf("**error in exec");
        }
    }

}
4

1 に答える 1

1

あなたdup()またはdup2()標準入力または標準出力へのパイプの場合、execvp()またはその親戚の1つを使用する前に、パイプの両方のファイル記述子を閉じる必要があります。追加:

close(pfds[1]);

子コードに。

親プロセスを実行する前に、子プロセスを終了する必要があります(wait()ループ内にいるため)。wait()ECHILDなどのエラーが返されないことを確認する必要があることに注意してください。もしそうなら、あなたはループを超えることはありません。ここでも、両方のパイプファイル記述子を閉じる必要があります。

子がパイプに収まるよりも多くのデータを生成する場合、子はパイプへの書き込みをブロックされ、親は子が死ぬのを待つことをブロックされることに注意してください—デッドロック。


終了せずにメインに戻すにはどうすればよいですか?

main()子または親のいずれかexecvp()が与えられたコマンドに失敗しない限り、そのコードをに戻すことはできません。fork()おそらく、そこに余分なものが必要になるでしょう。

そして、待機は通常、2人の子のうちの1人ではなく、親プロセスによって行われます。

于 2012-11-16T08:27:53.663 に答える