C++ Shell 多管道不工作?

Posted

技术标签:

【中文标题】C++ Shell 多管道不工作?【英文标题】:C++ Shell multiple pipelines are not working? 【发布时间】:2019-05-28 15:09:55 【问题描述】:

我曾在 C++ 中使用过管道,并且设法使单个管道正常工作。我正在努力让多个管道正常工作。我不知道它到底哪里出了问题。

我用来测试单个管道的示例:

ls -l | grep test

我用来测试多个管道的示例:

ls -l | grep test | grep test2

第一个命令对我来说很好。 但是,第二个命令对我没有任何作用。

编辑 1-6-2019:我将尝试使用此伪代码

left_pipe = NULL
right_pipe = NULL

for each command:

    if not last:
        right_pipe = pipe()

    fork():
        child:
            if left_pipe is not NULL:
                STDIN = left_pipe.read
            if right_pipe is not NULL:
                STDOUT = right_pipe.write
            left_pipe.close_W()
            right_pipe.close_R()
            execute()
            left_pipe.close_RW()
            //Move right pipe to the left side for the next command
            left_pipe = right_pipe
end

如果有任何见解/帮助,我将不胜感激。

谢谢转发。

【问题讨论】:

旁白:5 级嵌套会导致代码不可读。考虑重构您的 execute 方法。 以后会调查的。 什么都没有是什么意思?喜欢程序立即退出还是继续运行? @Quimby 应该解释一下,我的错。我刚刚在 shell 中执行程序后打印了状态。如果我正在执行 ls -l | grep 测试 | grep test2,然后我得到以下信息:-> 程序 test2 以状态码 256 结束。但是,程序继续运行,它可以接受我的输入。 您在创建管道之前调用了dup2ReadPipe!请先致电pipe 【参考方案1】:

正如@AndyG 所说,请重构代码,它混乱、冗余且容易出错。以下是这些错误:

您没有关闭管道。 READPIPE, WRITEPIPE 文件描述符仍然是打开的,这让读者保持 跑步。 EOF 只有在所有写端都关闭时才被读取。 在子节点中打开管道没有意义,无法将它们传递给下一个管道。 在执行中间命令期间,有两个活动管道 - 读取左侧管道的末端作为输入。将右管道的末端写入输出。

在伪代码中你想做这样的事情:

left_pipe = NULL
right_pipe = NULL

for each command:

    if not last:
        right_pipe = pipe()

    fork():
        child:
            if left_pipe is not NULL:
                STDIN = left_pipe.read
            if right_pipe is not NULL:
                STDOUT = right_pipe.write
            left_pipe.close_W()
            right_pipe.close_R()
            execute()
            left_pipe.close_RW()
            //Move right pipe to the left side for the next command
            left_pipe = right_pipe
end

加上一些错误检查,close_ 应该忽略已经关闭/不存在的管道。关闭孩子很重要,否则孩子会保持自己的生命,因为它会阻塞left_pipe.read,这将等待left_pipe.write (由同一个孩子持有)结束写点东西。 p>

我希望你同意这也更具可读性。

【讨论】:

感谢您的反应。确实,它更具可读性。不知何故,我认为将其拆分为方法会更干净。明天我会调查并及时通知您。

以上是关于C++ Shell 多管道不工作?的主要内容,如果未能解决你的问题,请参考以下文章

多管道C程序不起作用

C++ 使用命名管道

第三章:管道符重定向与环境变量

命名管道:C# 服务器、C++ 客户端

带有管道的Shell实现和c中的I O重定向

从管道将值读入 shell 变量