gpt4 book ai didi

C++ Shell 多管道不工作?

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:50 25 4
gpt4 key购买 nike

我曾在 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

我将不胜感激任何见解/帮助。

感谢转发。

最佳答案

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

  • 你没有关闭管道。 READPIPEWRITEPIPE 文件描述符仍然打开,这让读者运行。 EOF 只有在所有写端都关闭时才可读。
  • 在 child 身上打开管道没有意义,没有办法将它们传递给下一个。
  • 在执行中间命令期间,有两个事件管道 - 读取左侧管道的末端作为输入。将右管道的末尾写为输出。

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

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_ 应该忽略已经关闭/不存在的管道。关闭 child 很重要,否则 child 会保持自己活着,因为它会阻塞 left_pipe.read 等待 left_pipe.write ( 持有同一个 child )结束写点东西。

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

关于C++ Shell 多管道不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56345205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com