1

シンプルなシェルを実装しようとしています。つまり、2 番目の execve (ご参考までに、execvp ではなく execve を使用する必要があります) は、コマンドが見つからないか、単に失敗して終了することを示しています。これは私のパイプコードです。

switch(fork()) {
case -1:
        fatal("1st Fork Failed In Pipe!");
case 0:
        break;
default:
        wait(&status);
        return(status);
}

if(pipe(pipe_line) == -1) {
    fatal("Pipe Failed!");
}

switch(fork()) {
case -1:
        fatal("2nd Fork Failed In Pipe!");
case 0:
        dup2(pipe_line[1], 1);
        close(pipe_line[0]);
        close(pipe_line[1]);
        execv(cmd[0].name, cmd[0].argv);
        fatal("1st Execv Failed!");
default:
        dup2(pipe_line[0], 0);
        close(pipe_line[0]);
        close(pipe_line[1]);
        execv(cmd[1].name, cmd[1].argv);
        fatal("2nd Execv Failed!");
}

fflush(stdout);

注: 1. cmd[1].name が正しいことを確認するためにテストしました...正しいディレクトリであるようにします。そしてその cmd[1].argv はnullではありません...そして実際には何かが含まれています。私はすべてを試しました...しかし、なぜそれが機能しないのかわかりません。

結果は次のとおりです。

ls | wc
wc: invalid zero-length file name
wc: ���|")�:ʊЪ8�m���1��a�������K�!���*"ks8���$: No such file or directory
wc: �]S�: No such file or directory
wc: invalid zero-length file name
wc: &�be: No such file or directory
wc: ����: No such file or directory
wc: T: No such file or directory
0 0 0 total

編集!!!なんらかの理由で、ケース0に入らないことに気付きました.フォークは失敗しません..しかし、ケース0に入ることはありません。なぜでしょうか?

あなたの助けは大歓迎です!

4

1 に答える 1

1

あなたnameargvデータが壊れているようです。簡単なテストを実行することを検討してください。calls を、コマンドとfor each child を出力する に置き換えます (子の 1 つを呼び出して分離しますexecve) 。printfargvsleep()

于 2013-10-22T20:17:26.097 に答える