シンプルなシェルを実装しようとしています。つまり、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に入ることはありません。なぜでしょうか?
あなたの助けは大歓迎です!