python - os.open(): 没有这样的设备或地址?
我想试试命名管道,所以我下载了一段代码并修改了一下来测试:
fifoname = '/home/foo/pipefifo' # must open same name
def child( ):
pipeout = os.open(fifoname, os.O_NONBLOCK|os.O_WRONLY)
# open fifo pipe file as fd
zzz = 0
while 1:
time.sleep(zzz)
os.write(pipeout, 'Spam %03d\n' % zzz)
zzz = (zzz+1) % 5
def parent( ):
pipein = open(fifoname, 'r') # open fifo as stdio object
while 1:
line = pipein.readline( )[:-1] # blocks until data sent
print 'Parent %d got "%s" at %s' % (os.getpid(), line, time.time( ))
if __name__ == '__main__':
if not os.path.exists(fifoname):
os.mkfifo(fifoname) # create a named pipe file
if len(sys.argv) == 1:
parent( ) # run as parent if no args
else:
child()
我运行这个脚本时,出现了这个错误:
pipeout = os.open(fifoname, os.O_NONBLOCK|os.O_WRONLY) # open fifo pipe file as fd
OSError: [Errno 6] No such device or address: '/home/carrier24sg/pipefifo'
这个错误是怎么回事呢?(我在Linux上运行的是Python 2.6.5)
3 个回答
-2
Linux不太喜欢操作系统的命令,比如:
os.getlogin()
os.open()
还有很多其他的命令。
0
在Linux上这个对我来说是有效的:
import time
import os, sys
fifoname = '/tmp/pipefifo' # must open same name
def child( ):
pipeout = os.open(fifoname, os.O_NONBLOCK|os.O_WRONLY) # open fifo pipe file as fd
zzz = 0
while 1:
time.sleep(zzz)
os.write(pipeout, 'Spam %03d\n' % zzz)
zzz = (zzz+1) % 5
def parent( ):
pipein = open(fifoname, 'r') # open fifo as stdio object
while 1:
line = pipein.readline( )[:-1] # blocks until data sent
print 'Parent %d got "%s" at %s' % (os.getpid(), line, time.time( ))
if __name__ == '__main__':
if not os.path.exists(fifoname):
os.mkfifo(fifoname) # create a named pipe file
if len(sys.argv) == 1:
parent( ) # run as parent if no args
else:
child()
我觉得问题可能跟你用的平台有关,你用的是什么平台呢?或者可能是一些权限的问题。
13
来自 man 7 fifo
的内容:
一个进程可以以非阻塞模式打开一个命名管道(FIFO)。在这种情况下,如果没有人先打开写入端,那么只打开读取端是可以成功的;但是如果你只打开写入端,就会失败,并显示
ENXIO
(没有这样的设备或地址),除非另一端已经被打开。
所以你看到这个让人困惑的错误信息,是因为你试图打开一个命名管道进行读取,但同时又想以非阻塞的方式打开它进行写入。
在你的具体例子中,如果你先运行 child()
再运行 parent()
,那么就会出现这个错误。