gpt4 book ai didi

python 3 : select() behaves weird with UNIX FIFO

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:20 25 4
gpt4 key购买 nike

我试图在 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

更新:

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:~#

最佳答案

我能够通过以读写和非阻塞 I/O 方式打开 FIFO 来解决问题。

我的工作代码:

#! /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)

inFD = os.open(myInput, os.O_RDWR | os.O_NONBLOCK)
sIn = os.fdopen(inFD, 'r')

try:
loop = 5
while loop:
loop = loop - 1
readMe = select.select([sIn], [], [])[0]
print(readMe, file = sys.stderr);
if len(readMe):
a = sIn.read()
print('Message <|' + ''.join(a) + '|>', file = sys.stderr)
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] 4179
root:~# echo 'Hello World !!!' > ./inFIFO
root:~# [<_io.TextIOWrapper name=3 mode='r' encoding='UTF-8'>]
Message <|Hello World !!!
|>

root:~# echo 'Hello World !!!' > ./inFIFO
[<_io.TextIOWrapper name=3 mode='r' encoding='UTF-8'>]
Message <|Hello World !!!
|>
root:~#

关于 python 3 : select() behaves weird with UNIX FIFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53019765/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com