Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用并行命名管道避免死锁?_Linux_Shell_Unix_Named Pipes_Fifo - Fatal编程技术网

Linux 如何使用并行命名管道避免死锁?

Linux 如何使用并行命名管道避免死锁?,linux,shell,unix,named-pipes,fifo,Linux,Shell,Unix,Named Pipes,Fifo,我正在工作。它当前基于由命名管道连接的shell工具。多个流程协同工作完成工作,通过指定的管道进行通信,这与工厂中的生产线没有什么不同 总的来说,它工作得很好,但是有一个主要问题。如果进程通过两个或多个命名管道进行通信,“发送”进程和“接收”进程必须以相同的顺序打开管道。这是因为当进程打开命名管道时,它会阻塞,直到另一端也被打开 我想要一种避免这种情况的方法,不必为每个管道生成额外的“助手”进程,不必对现有组件进行黑客攻击,也不必为了避免这个问题而干扰程序网络 理想情况下,我正在寻找一些“非阻塞

我正在工作。它当前基于由命名管道连接的shell工具。多个流程协同工作完成工作,通过指定的管道进行通信,这与工厂中的生产线没有什么不同

总的来说,它工作得很好,但是有一个主要问题。如果进程通过两个或多个命名管道进行通信,“发送”进程和“接收”进程必须以相同的顺序打开管道。这是因为当进程打开命名管道时,它会阻塞,直到另一端也被打开

我想要一种避免这种情况的方法,不必为每个管道生成额外的“助手”进程,不必对现有组件进行黑客攻击,也不必为了避免这个问题而干扰程序网络

理想情况下,我正在寻找一些“非阻塞fifo”选项,其中fifo上的“打开”总是立即成功,但如果管道缓冲区已满(或读取时为空),后续操作可能会阻塞。。。我甚至会考虑使用一个内核补丁来达到这个效果。根据fifo(7),O_NONBLOCK在打开fifo时确实做了一些不同的事情,这不是我想要的,为了使用它,我必须重写所有现有的shell工具,比如cat

下面是一个死锁的最小示例:

mkfifo a b
(> a; > b; ) &
(< b; < a; ) &
wait
mkfifo a b
(>a;>b;)&
(

如果你能帮助我理智地解决这个问题,我将非常感激

这里有一个关于使用命名管道的
O_NONBLOCK
的详细说明:

听起来您希望它在整个环境中工作,而不更改任何C代码。因此,一种方法是将
LD_PRELOAD
设置到某个共享库中,该库包含
open(2)
的包装,每当
pathname
引用命名管道时,该包装将
O_NONBLOCK
添加到
标志中

使用
LD_PRELOAD
重写库函数的简明示例如下:


无论这在实践中是否真正起作用而不破坏其他任何东西,您都必须自己去发现(请让我们知道!)。

谢谢,这是个好主意。我想我必须做一些额外的黑客操作,不仅仅是添加O_NONBLOCK来打开,而且可能是可以做到的。非常感谢。LD_预加载虽然有点邪恶,但比修补内核更安全,难度更小!