我实现了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
处理管道时,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);
但是它写了一个输出然后永远循环,我不明白为什么。一种解决方案是保存所有命令,然后不为最后一个重定向输出,但我想在现场执行它们。