0

シェルの一部を実装します。その一つがパイプです。解析中に、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 つの解決策は、すべてのコマンドを保存し、最後のコマンドの出力をリダイレクトしないことですが、その場で実行したいと考えています。

4

0 に答える 0