[Lua]Lua的posix模块
luaposix是一个lua的POSIX库,其中也包括了curses库的实现。这个项目托管在github上:https://github.com/rrthomas/luaposix
ubuntu的源中是有这个库的,但是版本太老,很多重要的函数没有实现(比如open/read/write等)。下面这段简单的脚本可以用来检查一下其中到底实现了什么。
#! /usr/bin/lua require("posix") for key, value in pairs(posix) do print(key, tostring(value)) end
回到github上的luaposix上来,这个项目里面东西还真不少,而且使用了autotools作为构建工具。不过我真正需要用的东西基本都在lposix.c文件中,其他的诸如lcurses.c并不关心。对我来说为了编译这一个文件动用autotools有点不值,于是干脆将这个文件单独拿出来使用(lua52compat.h也需要一同拿出来,这个头文件是用来兼容lua 5.2的),编译命令如下:
${CC} lposix.c -shared -o luaposix.so -lrt -lcrypt -fPIC -Wall
编译成luaposix.so是为了和系统中的luaposix区别开,同时lposix.c中的luaopen_*函数也需要修改一下。
下面说一下使用。这个东西是没有文档的,当然,lua的bindings库的实现都挺简单,通过看代码找用法也不难,不过有时候难免迷糊(其实是我迷糊了...),所以写下其中关键的几点。
对于luaposix实现的大部分函数,当调用失败的时候是通过pusherror函数想栈中压入返回值的。这个函数会向栈中压入3个值,其中第一个是nil,表明调用失败;第二个是strerror得到的错误的描述信息;第三个则是errno的值。如果调用成功,则通常直接将系统调用的返回值压栈返回。
像open这种接受一个或多的标志位做参数的函数,luaposix将其设计为接受lua table作为参数,该table中可以放入和原来的系统调用接受的标志位对应的字符串,比如:
fifo, err = posix.open(fifo_path, {"RDONLY"})
不过也有例外,access调用的binding被设定为接受字符串作为第二个函数,字符串中的r/w/x/f对应R_OK/W_OK/X_OK/F_OK,空格会被忽略,其他字符则会导致报错。
mkfifo调用的binding只接受一个参数,它原有的第二个参数被固定为0777,这里luaposix的作者有点偷懒^_^。
很多函数没有用到,如果再遇到用法不那么明了的函数,我会补充在这里。
2012年5月06日 05:00
如果 C 中是多个标志位 OR 在一起,luaposix 里怎么表示的呢?
2012年5月08日 18:38
@依云: 比如上面举的posix.open的例子,第二个参数类型是lua table,所以是可以放入多个字符串的。
2012年5月08日 19:19
@Ervin: 哦,原来如此。
2024年1月15日 23:50
I curious more interest in some of them hope you will give more information on this topics in your next article