2011-10-19 70 views
2

我寫從FIFO.for讀取數據有點LUA腳本,這個我用的是經典:Lua的非阻塞讀存取權限的空FIFO

f=assert(io.open("/tmp/myfifo") 
f:read() 

當FIFO空/ feeded,我的腳本塊。有沒有辦法避免這種情況?

+0

奇怪,這只是返回'nil'時沒有什麼留在FIFO中。 – jpjacobs

+0

在Linux上,似乎在FIFO上存在阻止讀取訪問和非阻止讀取訪問。我的腳本嘗試讀取的fifo是由mpd生成的。如果我在空fifo上使用cat,cat命令會阻塞,直到fifo中有數據。 – cedlemo

+0

啊,現在我明白了。這是io.open阻止,而不是閱讀。 – jpjacobs

回答

3

我猜想沒有直接的Lua-only方法。隨着luajit http://luajit.org/(提供FFI)是可能的:

local ffi = require'ffi' 

--- The libc functions used by this process. 
ffi.cdef[[ 
     int open(const char* pathname, int flags); 
     int close(int fd); 
     int read(int fd, void* buf, size_t count); 
]] 
local O_NONBLOCK = 2048 
local chunk_size = 4096 
local buffer = ffi.new('uint8_t[?]',chunk_size) 
local fd = ffi.C.open('mypipe',O_NONBLOCK)  
local nbytes = ffi.C.read(fd,buffer,chunksize) 
-- .. process data