2013-01-15 19 views
17

utworzyć FIFO i okresowo otwórz go w tylko do odczytu i nie blockingly trybie z a.py:Jak odczytać nazwę FIFO bez blokowania?

os.mkfifo(cs_cmd_fifo_file, 0777) 
io = os.open(fifo, os.O_RDONLY | os.O_NONBLOCK) 
buffer = os.read(io, BUFFER_SIZE) 

Od b.py, otworzy FIFO do zapisu:

out = open(fifo, 'w') 
out.write('sth') 

Następnie a.py spowoduje błąd:

buffer = os.read(io, BUFFER_SIZE) 

OSError: [Errno 11] Resource temporarily unavailable 

Ktoś wie, co jest nie tak?

+1

możliwy duplikat [Co spowodować warunki w otwartym, nonblocking nazwanego potoku (FIFO) jest "niedostępny" do czytania?] (http://stackoverflow.com/questions/10021759/what-conditions-result-in-an-opened-nonblocking-named-pipe-fifo-being-unavai) Jednak to pytanie z pewnością jest nadal przydatny, ponieważ jego unikatowe sformułowanie oznacza, że ​​był pierwszym, który znalazłem w Google. – Seanny123

+0

'NameError: name 'fifo' nie jest zdefiniowane." Czy mógłbyś naprawić ten przykład? – n611x007

Odpowiedz

13

Według podręcznika z read(2):

EAGAIN or EWOULDBLOCK 
      The file descriptor fd refers to a socket and has been marked 
      nonblocking (O_NONBLOCK), and the read would block. 
      POSIX.1-2001 allows either error to be returned for this case, 
      and does not require these constants to have the same value, so 
      a portable application should check for both possibilities. 

Więc co dostajesz to, że nie ma dostępnych danych do odczytu. Jest bezpieczny do obsługi błędu takiego:

try: 
    buffer = os.read(io, BUFFER_SIZE) 
except OSError as err: 
    if err.errno == errno.EAGAIN or err.errno == errno.EWOULDBLOCK: 
     buffer = None 
    else: 
     raise # something else has happened -- better reraise 

if buffer is None: 
    # nothing was received -- do something else 
else: 
    # buffer contains some received data -- do something with it 

upewnić się, że moduł errno przywożone: import errno.

+0

po wypróbowaniu, a.py raise: UnboundLocalError: zmienna lokalna "buffer", do której odwoływano się przed przypisaniem, – chaonin

+0

@chaonin Próbowałem zgadnąć, co jest przyczyną (wcześniej nie korzystałem z bufora) i zaktualizowałem mój przykład. Mam nadzieję, że teraz jest to bardziej przejrzyste. –

+1

io = os.open (FIFO, os.O_RDONLY | os.O_NONBLOCK) try: \t bufor = os.read (IO, BUFFER_SIZE) wyjątkiem OSError jako ERR: jeśli err.errno errno == .EAGAIN lub err.errno == errno.EWOULDBLOCK: wprost innego: przebicie err jobs_infile = shlex.split (bufor) os.close (IO) – chaonin

-2
out = open(fifo, 'w') 

Kto ją zamknie? Wymień zapisu Open + przez to:

with open(fifo, 'w') as fp: 
    fp.write('sth') 

UPD: Ok, niż po prostu zrobić to:

out = os.open(fifo, os.O_NONBLOCK | os.O_WRONLY) 
os.write(out, 'tetet') 
+1

Nie wypchnąłem fałszywego kodu ... – chaonin

+1

To nie odpowiada na pytanie, ani nie jest istotne, biorąc pod uwagę, że podany kod jest oczywiście urywkiem. (-1) –

+0

Jeśli Twoja edycja dotyczyła mojej skargi, nie została podjęta. –