python - os.open(): 没有这样的设备或地址?

7 投票
3 回答
10576 浏览
提问于 2025-04-16 22:52

我想试试命名管道,所以我下载了一段代码并修改了一下来测试:

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(),那么就会出现这个错误。

撰写回答