1

考虑以下来源,为简单起见减少

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); 
  }
}

因此它创建了一个管道并将输出重定向lscat.

它工作得很好,没有问题。但是更改catmorebash 休息。

症状是:

  • 你没有看到你输入的任何东西
  • 按“enter”会显示一个新提示,但不是在新行中,而是在同一行中
  • 您可以执行任何命令并查看输出
  • reset帮助解决问题。

所以键盘输入有问题,它在那里,但不可见。

这是为什么?

更新:

  • 的输出ls | more相当于我的程序的输出
  • more进程没有完成,它是孤立的ls
  • 唯一可见的问题是父进程退出后控制台的状态
  • 在某些系统上,它确实按预期工作。例如,在 OpenSUSE 上我没有问题,在 Kubuntu 上。我找不到任何关于我应该寻找什么差异的信息,more两个系统上的二进制文件都不同
4

1 回答 1

0

因为不像cat,more是一个交互式程序,它需要更多stdin,stdout并且stderr-- 它需要一个您的系统调用无法提供的终端。尝试more在管道或脚本中运行,看看会发生什么。

另请注意,bash此处不涉及任何阶段,execlp函数调用将当前进程替换为指定为参数的另一个进程。

于 2012-11-10T16:58:54.227 回答