我整天都在抱怨LuaJIT的一个错误行为。libc
stat
函数在其stat
缓冲区中返回错误的值。
LuaJIT脚本:
-- definitions for sys/types.h
typedef uint32_t mode_t;
typedef uint64_t dev_t;
typedef uint64_t ino_t;
typedef unsigned int nlink_t;
typedef int pid_t;
typedef unsigned int id_t;
typedef unsigned int uid_t;
typedef unsigned int gid_t;
typedef int64_t off_t;
typedef long blksize_t;
typedef int64_t blkcnt_t;
typedef uint64_t fsblkcnt_t;
typedef uint64_t fsfilcnt_t;
-- for sys/stat.h
struct stat {
dev_t st_dev; /* Device */
ino_t st_ino; /* File serial number. */
nlink_t st_nlink; /* Link count. */
mode_t st_mode; /* File mode. */
uid_t st_uid; /* User ID of the file's owner. */
gid_t st_gid; /* Group ID of the file's group.*/
int __pad0;
dev_t st_rdev; /* Device number, if device. */
off_t st_size; /* Size of file, in bytes. */
blksize_t st_blksize; /* Optimal block size for I/O. */
blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */
/* __USE_XOPEN2K8 */
struct timespec st_atim; /* Time of last access. */
struct timespec st_mtim; /* Time of last modification. */
struct timespec st_ctim; /* Time of last status change. */
long __unused[3];
};
/* luajit calls this */
int __xstat(int ver, const char *path, struct stat *buf);
-- lua stat function part
stat = function(path, buf) return ffi.C.__xstat(_STAT_VER, path, buf) end;
以上摘录自我的系统C头文件。现在,LuaJIT调用为:
local buf = ffi.new("struct stat[1]")
local res = stat('main.c', buf)
ffi.cdef [[
int printf(const char *fmt, ...);
]]
ffi.C.printf("size: %lu, ino: %lu, mode: %d\n", buf[0].st_size, buf[0].st_ino, buf[0].st_mode);
struct stat[1]
中的ffi.new
是通过luajit邮件列表建议的。
更新
这个想法是叫linux __xtat。声明已添加。
__xstat
方式摘自https://github.com/Wiladams/LJIT2libc。其他人认为C
标头中的定义太多了。
输出正常,直到st_mode
字段。该字段为零。我用C
语言进行了测试,一切都很好。因此,问题在于LuaJIT stat
给我错误的结果。请告知该怎么办。整天都在那件事上。
我在这里给自己留个字条,因为我相信在正常情况下没有其他人会犯这样的错误。我的错误是C
标头的读取不正确。在我的系统中,#include
标头的C
的级别为[[[仅三个,这些级别导致实类型定义。
luajit
邮件列表用户,指出我对nlink_t
类型的定义有误。[旧的是:typedef unsigned int nlink_t;
这应该是:typedef unsigned long nlink_t;