libc stat函数和LuaJIT

问题描述 投票:0回答:1

我整天都在抱怨LuaJIT的一个错误行为。libcstat函数在其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 lua luajit
1个回答
0
投票

我在这里给自己留个字条,因为我相信在正常情况下没有其他人会犯这样的错误。我的错误是C标头的读取不正确。在我的系统中,#include标头的C的级别为[[[仅三个,这些级别导致实类型定义。

luajit邮件列表用户,指出我对nlink_t类型的定义有误。

[旧的是:typedef unsigned int nlink_t;

这应该是:typedef unsigned long nlink_t;

© www.soinside.com 2019 - 2024. All rights reserved.