Lua 对空 FIFO 的非阻塞读访问

Posted

技术标签:

【中文标题】Lua 对空 FIFO 的非阻塞读访问【英文标题】:Lua Non blocking read acces on empty FIFO 【发布时间】:2011-10-19 11:06:51 【问题描述】:

我正在编写一个从 FIFO 读取数据的小 lua 脚本。为此,我使用经典的:

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

当 fifo 为空/未输入时,我的脚本会阻塞。有没有办法避免这种情况?

【问题讨论】:

奇怪,这里它只是返回nil,当先进先出中没有任何东西时。 Linux上的fifo似乎有阻塞读访问和非阻塞读访问。我的脚本尝试读取的 fifo 是由 mpd 生成的。如果我在空的fifo上使用cat,cat命令会阻塞直到fifo中有数据。 啊,现在我明白了。阻塞的是 io.open,而不是读取。 嗯不是真的,我检查过我是否只使用 f=io.open("/tmp/myfifo"); f:close 脚本不会阻塞 我认为使用基本 Lua 函数我尝试this post about fopen 设置模式 r+ 确实是不可能的 io.open 解除阻塞,但使读取阻塞:p 【参考方案1】:

我猜没有直接的 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

【讨论】:

使用 Tarantool 提供内置的 fio.open() 有 O_NONBLOCK 标志。

以上是关于Lua 对空 FIFO 的非阻塞读访问的主要内容,如果未能解决你的问题,请参考以下文章

Linux 非阻塞 fifo(按需日志记录)

POSIX FIFO 在阻塞模式下打开时冻结

NIO实现TCP的非阻塞通信

在 verilog中的非阻塞赋值在啥时候赋值时刻结束?

Unix环境高级编程(十五)高级I/O

如何在 Undertow 的非阻塞处理程序中执行阻塞代码?