Форум сайта python.su
0
Доброго времени суток!
Создал named pipe между двумя программами на питоне. Спустя некоторое время своей работы, одна программа должна отправить сообщение в пайп второй. Все это время, вторая программа в цикле читает из пайпа.
При запуске второй программы, во время ReadFile() возникает эксепшн:
WindowsError: exception: access violation writing 0x1D1A9FD8
DBwrFuz = CreateNamedPipe("\\\\.\\pipe\\DBwr-Fuz-pipe", # pipe name PIPE_ACCESS_DUPLEX, # read/write access PIPE_TYPE_MESSAGE | # message type pipe PIPE_READMODE_MESSAGE | # message-read mode PIPE_WAIT, # blocking mode PIPE_UNLIMITED_INSTANCES, # max. instances BUFSIZE, # output buffer size BUFSIZE, # input buffer size 0, # client time-out None) # default security attribute if DBwrFuz == -1: print "Error! Create DBwr-Fuz pipe " + str(GetLastError()) return -1
hDBwrFuz = CreateFile("\\\\.\\pipe\\DBwr-Fuz-pipe", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None) if hDBwrFuz == -1: print "Error! Open DBwr-Fuz pipe " + str(GetLastError()) return -1 while True: try: msg_size, msg = ReadFile(hDBwrFuz, 512) except pywintypes.error, exc: if exc[0] not in [winerror.ERROR_BROKEN_PIPE,]: raise # except Exception as e: #Fuzzer terminated! # print(e) # break
Отредактировано 3ka5_cat (Авг. 29, 2012 14:50:43)
Офлайн
0
Поправил с помощью PeekNamedPipe():
while True: try: (nRead, nAvail, nMessage) = PeekNamedPipe(hDBwrFuz, 0) if nAvail: (msg_size, msg ) = ReadFile(hDBwrFuz, nAvail)
Офлайн
0
Кстати, не поправил. Все еще актуально. Когда приходит сообщение и проходит проверку через PeekNamedPipe, nAvail равно длине сообщения, но все равно та же самая ошибка выскакивает. Да и PeekNamedPipe какое-то странное решение…
Офлайн
0
Ошибка глупейшая:
пытался использовать windll.kernel32.ReadFile с аргументами для win32file.ReadFile вместо win32file.ReadFile
Офлайн