我实现了shell的某些部分。其中之一是管道。在解析期间,我执行命令用 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
处理管道时,会输出最后一条命令 in 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);
但是它会写一个输出然后永远循环,我不明白为什么。一种解决方案是保存所有命令,然后不重定向最后一个命令的输出,但我想当场执行它们。