2012-11-10 105 views
1

的目标考虑下面的源,减小为简单起见“多个”管道命令中断的bash

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重定向。

它工作得很好,没有问题。但改变catmore和bash休息。

的症状是:

  • 你没有看到任何你键入
  • 按“ENTER”显示了一个新的提示,而不是在一个新的生产线,但在同一个
  • 你可以执行任何命令并看到输出
  • reset有助于解决问题。

因此,键盘输入存在问题,它在那里,但不可见。

这是为什么?

UPDATE:

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

它在我的系统上正常工作,具有'more' .. – Omkant

+0

有趣。在我的其他系统上它也可以工作。所以它适用于OpenSUSE,但不适用于Kubuntu。这更糟糕:/ –

+0

立即更新。 –

回答

0

因为不像catmore是需要超过stdinstdoutstderr交互式程序不同 - 它需要您的系统调用不能提供的终端。尝试在管道或脚本中运行more,看看会发生什么。

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

+0

那么'ls |更多'给我与'ls |相同的结果猫',为简短的输入。当然,我知道这两者之间的区别。正如我在评论中提到的那样,它在SUSE上按照预期工作,但在Kubuntu上它却没有。不同的实现,也许不同的环境? 我已经提到过'bash',因为在父进程完成后,结果是可观察的。孩子的过程依然存在。为什么?它是否尝试读取终端的大小并未能检测到输出足够? –