考虑以下来源,为简单起见减少
int main()
{
int d[2];
pipe(d);
if(fork())
{
close(1);
dup(d[1]);
execlp("ls", "ls", NULL);
}
else
{
close(0);
dup(d[0]);
execlp("cat", "cat", NULL);
}
}
因此它创建了一个管道并将输出从 ls
重定向到 cat
。
它工作得很好,没有问题。但是将 cat
更改为 more
和 bash 中断。
症状是:
- 您没有看到您输入的任何内容
- 按“enter”会出现一个新的提示,但不是在新的一行中,而是在同一行中
- 你可以执行任何命令并查看输出
reset
有助于解决问题。
所以键盘输入有问题,它在那里,但不可见。
这是为什么?
更新:
ls 的输出 | more
相当于我程序的输出more
进程没有完成,它被ls
孤立了
- 唯一可见的问题是父进程退出后控制台的状态
- 在某些系统上它确实按预期工作。例如,在 OpenSUSE 上我没有问题,在 Kubuntu 上。我找不到任何关于我应该寻找哪些差异的信息,
more
两个系统上的二进制文件都不同
最佳答案
因为与cat
不同,more
是一个交互式程序,它需要的不仅仅是stdin
、stdout
和stderr
-- 它需要一个您的系统调用无法提供的终端。尝试在管道或脚本中运行 more
,看看会发生什么。
另请注意,bash
在任何阶段均未参与此处,execlp
函数调用将当前进程替换为指定为参数的另一个进程。
关于c - "more"作为管道命令的目标会破坏 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324005/