Я пытаюсь подождать в UNIX FIFO для какой-либо входной строки. Я использую select () для ожидания на FD, чтобы быть готовым к чтению. В первый раз мой код ожидает, как ожидалось, но затем select () продолжает возвращаться с успехом, даже если FD больше не готов к чтению.
Вот мой код:
#! /usr/bin/python3
import errno
import time
import sys
import os
import select
import string
myInput = './inFIFO'
try:
if os.path.exists(myInput):
os.unlink(myInput)
os.mkfifo(myInput)
except Exception as e:
sys.stderr.write("ERROR: " + str(e))
sys.exit(2)
sIn = open(myInput, 'r')
try:
loop = 5
while loop:
loop = loop - 1
readMe = select.select([sIn], [], [])[0]
print(readMe, file = sys.stderr);
if len(readMe):
a = sIn.readlines()
print('Message <|' + ''.join(a) + '|>', file = sys.stderr)
sIn.flush()
except Exception as e:
sys.stderr.write('ERROR: ' + str(e))
sys.stdin.close()
sys.stdout.close()
sys.stderr.close()
os.unlink(myStdin)
sys.exit(1)
Вот вывод:
root:~# ./select.py &
[1] 4035
root:~# echo 'Hello World !!!' > ./inFIFO
root:~# [<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <|Hello World !!!
|>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[1]+ Done ./select.py
root:~#
Почему select () ведет себя необычно?
Я использую LinuxMint 19 amd64 и Python 3.6.6
UPDATE:
Обновлен код с os.read()
все та же история ...
Новый код:
#! /usr/bin/python3
import errno
import time
import sys
import os
import select
import string
myInput = './inFIFO'
try:
if os.path.exists(myInput):
os.unlink(myInput)
os.mkfifo(myInput)
except Exception as e:
sys.stderr.write("ERROR: " + str(e))
sys.exit(2)
sIn = open(myInput, 'r')
try:
loop = 5
while loop:
loop = loop - 1
readMe = select.select([sIn], [], [])[0]
print(readMe, file = sys.stderr);
if len(readMe):
a = os.read(sIn.fileno(), 8192).decode()
print('Message <|' + ''.join(a) + '|>', file = sys.stderr)
sIn.flush()
except Exception as e:
sys.stderr.write('ERROR: ' + str(e))
sys.stdin.close()
sys.stdout.close()
sys.stderr.close()
os.unlink(myStdin)
sys.exit(1)
Теперь вывод:
root:~# ./select.py &
[1] 4099
root:~# echo 'Hello World !!!' > ./inFIFO
root:~# [<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <|Hello World !!!
|>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[<_io.TextIOWrapper name='./inFIFO' mode='r' encoding='UTF-8'>]
Message <||>
[1]+ Done ./select.py
root:~#