Python 代码在尝试打开命名管道进行读取时挂起

发布于 2024-11-14 04:25:37 字数 764 浏览 3 评论 0原文

我正在尝试使用命名管道在守护程序和客户端之间设置两种方式的通信。尝试打开用于输入的命名管道时代码挂起,为什么?

class comm(threading.Thread):

def __init__(self):
    self.srvoutf = './tmp/serverout'
    self.srvinf = './tmp/serverin'
    if os.path.exists(self.srvoutf):
        self.pipein = open(self.srvoutf, 'r') 
        #-----------------------------------------------------Hangs here
    else:
        os.mkfifo(self.srvoutf)
        self.pipein = open(self.srvoutf, 'r')
        #-----------------------------------------------------or here
    if os.path.exists(self.srvinf):
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
    else:
        os.mkfifo(self.srvinf)
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
        
    threading.Thread.__init__ ( self )

I am trying to setup two way communication between a daemon and a client using named pipes. The code hangs while trying to open the named pipe used for input Why?

class comm(threading.Thread):

def __init__(self):
    self.srvoutf = './tmp/serverout'
    self.srvinf = './tmp/serverin'
    if os.path.exists(self.srvoutf):
        self.pipein = open(self.srvoutf, 'r') 
        #-----------------------------------------------------Hangs here
    else:
        os.mkfifo(self.srvoutf)
        self.pipein = open(self.srvoutf, 'r')
        #-----------------------------------------------------or here
    if os.path.exists(self.srvinf):
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
    else:
        os.mkfifo(self.srvinf)
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
        
    threading.Thread.__init__ ( self )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌无敌 2024-11-21 04:25:37

来自 open() 规范

当使用 O_RDONLY 打开 FIFO 或
O_WRONLY 设置:

如果设置了 O_NONBLOCK,则
只读的 open() 将返回
毫不拖延。一个 open() 为
如果出现以下情况,只写将返回错误
当前没有进程打开该文件
供阅读。

如果 O_NONBLOCK 被清除,则 open() 用于
只读会阻止调用
线程直到有线程打开文件
用于写作。一个 open() 为
只写会阻止调用
线程直到有线程打开文件
供阅读。

换句话说,当您打开命名管道进行读取时,默认情况下,该打开将阻塞,直到管道的另一端打开进行写入。要解决此问题,请使用 os.open() 并在命名管道的读取端传递 os.O_NONBLOCK 。

From the specification for open():

When opening a FIFO with O_RDONLY or
O_WRONLY set:

If O_NONBLOCK is set, an
open() for reading-only shall return
without delay. An open() for
writing-only shall return an error if
no process currently has the file open
for reading.

If O_NONBLOCK is clear, an open() for
reading-only shall block the calling
thread until a thread opens the file
for writing. An open() for
writing-only shall block the calling
thread until a thread opens the file
for reading.

In other words, when you open a named pipe for reading, by default the open will block until the other side of the pipe is opened for writing. To fix this, use os.open() and pass os.O_NONBLOCK on the read side of the named pipe.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文