Подтвердить что ты не робот

Проблема с именами python named

Я пытаюсь настроить двухстороннюю связь между демоном и клиентом с использованием именованных каналов. Код зависает при попытке открыть именованный канал, используемый для ввода. Почему?

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 )
4b9b3361

Ответ 1

Из спецификация для open():

При открытии FIFO с O_RDONLY или O_WRONLY:

Если установлено O_NONBLOCK, open() только для чтения. без задержки. Открытое() для запись только должна возвращать ошибку, если в настоящее время нет открытого файла для чтения.

Если O_NONBLOCK понятен, функция open() для только чтение только блокирует вызов нить, пока нить не откроет файл для записи. Открытое() для только для записи блокирует вызов нить, пока нить не откроет файл для чтения.

Другими словами, когда вы открываете именованный канал для чтения, по умолчанию open будет блокироваться до тех пор, пока другая сторона канала не будет открыта для записи. Чтобы исправить это, используйте os.open() и передайте os.O_NONBLOCK на стороне чтения именованного канала.