シェルの一部を実装します。その一つがパイプです。解析中に、dup2 で入出力をリダイレクトするコマンドを実行します。具体的には、次のことを行います (簡単にするためにここではエラー チェックを記述しませんが、コード内のエラーをチェックします)。解析が始まる前に私は持っています
int p[2];
pipe(p);
int stdin_copy = dup(0);
int stdout_copy = dup(1);
コマンドの実行:
dup2(p[1], 1);
// exec command with fork and execvp - it's all ok with this part
dup2(p[0], 0); // placed after exec in order to prevent redirect for first command
// in pipe
パイプが処理されると、最後のコマンドの出力が にあるp
ので、それを stdout に書き込もうとします。
dup2(stdout_copy, 1);
dup2(stdin_copy, 0); // restore original stdin/stdout
char c;
while (read(p[0], &c, sizeof(char)) > 0)
printf("%c", c);
しかし、出力を書き込んでから永久にループしますが、その理由がわかりません。1 つの解決策は、すべてのコマンドを保存し、最後のコマンドの出力をリダイレクトしないことですが、その場で実行したいと考えています。