Код Python зависает при попытке открыть именованный канал для чтения

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

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 )

person T_Mac    schedule 05.06.2011    source источник
comment
читает и записывает в блок каналов до тех пор, пока не будет подключен соответствующий считыватель или писатель   -  person tMC    schedule 05.06.2011


Ответы (1)


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

При открытии FIFO с установленным O_RDONLY или O_WRONLY:

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

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

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

person Nemo    schedule 05.06.2011