У меня есть именованный канал, на который я хочу реагировать, когда доступны данные. Я делаю это в контексте dbus. Для установки, у меня есть следующие:io_add_watch callback срабатывает только один раз?
mainloop = glib.MainLoop()
fifo = os.open('_notify', os.O_RDWR)
glib.io_add_watch(fifo, glib.IO_IN, notifyLoop, service)
try:
mainloop.run()
except KeyboardInterrupt:
mainloop.quit()
Так во 2-й и 3-й линии, я открываю именованный канал, и добавив к нему часы. Мой notifyLoop
обратного вызова:
def notifyLoop(fifo, cb_cond, service):
dataStream = service.characteristics[0]
all = os.read(fifo, 2048)
print('all', all, 'cb_cond', cb_cond)
payload, all = all[:20], all[20:]
while payload:
newValue = {'Value': [dbus.Byte(x) for x in payload]}
dataStream.PropertiesChanged(GATT_CHRC_IFACE, newValue, [])
payload, all = all[:20], all[20:]
В принципе, читать все, в трубе, а затем разбить на куски размером 20 и сигнализировать тех. Проблема в том, что обратный вызов срабатывает только один раз, в первый раз. В первый раз я вижу печать, но когда я пишу больше данных в трубу из другой программы, ничего не происходит. Неужели я не понимаю, как работает io_add_watch
?
Вот код, который я использовал, чтобы написать две отдельные вещи, названной трубы:
[email protected]:/Directory# python3
Python 3.4.2 (default, Oct 8 2014, 14:38:51)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> fifo = os.open('_notify', os.O_RDWR)
>>> os.write(fifo, b'\xDE\xAD')
2
>>> os.write(fifo, b'\xBE\xEF')
2
>>>
После первой записи, я вижу
all b'\xde\xad' cb_cond <flags G_IO_IN of type GIOCondition>
где программа DBus работает. Но ничего для второго не пишут.
Принятый ответ проще. – antoyo