2013-01-15 20 views
17

tôi tạo ra một FIFO, và định kỳ mở nó trong read-only và không blockingly chế độ từ a.py:Làm thế nào để đọc được đặt tên FIFO không bị chặn?

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

Từ b.py, mở fifo để viết:

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

Sau đó, a.py sẽ nêu ra một lỗi:

buffer = os.read(io, BUFFER_SIZE) 

OSError: [Errno 11] Resource temporarily unavailable 

Bất cứ ai biết điều gì là sai?

+1

thể trùng lặp của [những điều kiện dẫn đến một, nonblocking tên ống mở (fifo) là "không có sẵn" cho lần đọc?] (http://stackoverflow.com/questions/10021759/what-conditions-result-in-an-opened-nonblocking-named-pipe-fifo-being-unavai) Tuy nhiên, câu hỏi này chắc chắn vẫn hữu ích, vì đó là cách phân biệt duy nhất có nghĩa là nó là bản đầu tiên tôi tìm thấy trên Google. – Seanny123

+0

'TênError: tên 'fifo' không được xác định' bạn có thể sửa lỗi không? – n611x007

Trả lời

13

Theo manpage của 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. 

Vì vậy, những gì bạn đang nhận được là không có sẵn để đọc dữ liệu. Sẽ an toàn khi xử lý lỗi như sau:

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 

Đảm bảo bạn có mô-đun errno được nhập: import errno.

+0

sau khi thử, hãy tăng: UnboundLocalError: biến cục bộ 'buffer' được tham chiếu trước khi gán – chaonin

+0

@chaonin Tôi đã cố gắng đoán lý do là (trước đây tôi không sử dụng bộ đệm) và cập nhật ví dụ của mình. Hy vọng rằng nó là rõ ràng hơn bây giờ. –

+1

io = os.open (fifo, os.O_RDONLY | os.O_NONBLOCK) thử: \t đệm = os.read (io, BUFFER_SIZE) trừ OSError như err: nếu err.errno == errno .EAGAIN hoặc err.errno == errno.EWOULDBLOCK: qua khác: tăng err jobs_infile = shlex.split (đệm) os.close (io) – chaonin

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

Ai sẽ đóng nó cho bạn? Thay mở + ghi của bạn bằng cách này:

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

UPD: Ok, hơn là chỉ làm cho điều này:

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

Tôi chưa đẩy mã giả ra ... – chaonin

+1

Điều này không trả lời câu hỏi, cũng không phải là nó có liên quan xem xét mã được cho là rõ ràng là đoạn trích. (-1) –

+0

Nếu bản chỉnh sửa của bạn nhằm giải quyết khiếu nại của tôi, nó không có. –

Các vấn đề liên quan