c - "more"作为管道命令的目标会破坏 bash

标签 c exec pipe

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

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是一个交互式程序,它需要的不仅仅是stdinstdoutstderr -- 它需要一个您的系统调用无法提供的终端。尝试在管道或脚本中运行 more,看看会发生什么。

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

关于c - "more"作为管道命令的目标会破坏 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324005/

相关文章:

模拟调度程序的 C 程序

c - fork 和管道,我做错了什么?

c - 将一个字符串分成一定数量的子串(C)

LD可以访问某个地址的数据吗?

c - 在多个头文件和源文件中组织 C 语言变量和函数时出现警告

php - 从 PHP 执行 Python 脚本

c - 错误: indirection requires pointer operand ('int' invalid)

linux - ANT 执行失败 : java. io.IOException : Cannot run program "cp ": java. io.IOException : error=2, 没有这样的文件或目录

powershell - 如何在没有BOM的情况下在PowerShell中重定向输入?

angular - ngFor Angular2 中的动态管道