libc的stat函数和LuaJIT
2020-2-11 20:41:17
收藏:0
阅读:125
评论:1
我今天一整天都在排查LuaJIT出现的一个神秘问题。libc中的stat函数在其stat缓冲区中返回错误值。
LuaJIT脚本:
-- 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;
-- sys/stat.h中的定义
struct stat {
dev_t st_dev; /* 设备 */
ino_t st_ino; /* 文件序列号 */
nlink_t st_nlink; /* 链接数 */
mode_t st_mode; /* 文件模式 */
uid_t st_uid; /* 文件所有者的用户ID */
gid_t st_gid; /* 该文件的用户组ID */
int __pad0;
dev_t st_rdev; /* 如果是设备,则为设备号 */
off_t st_size; /* 文件大小(以字节为单位) */
blksize_t st_blksize; /* I/O的最佳块大小 */
blkcnt_t st_blocks; /* 分配的512字节块数 */
/* __USE_XOPEN2K8 */
struct timespec st_atim; /* 上次访问时间 */
struct timespec st_mtim; /* 上次修改时间 */
struct timespec st_ctim; /* 上次状态更改时间 */
long __unused[3];
};
/* luajit调用此函数 */
int __xstat(int ver, const char *path, struct stat *buf);
-- lua stat函数部分
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);
在Luajit邮件列表中,有人友好地建议在ffi.new中使用struct stat[1]。
更新
的想法是调用Linux的__xtat。添加了声明。
__xstat的方法来自https://github.com/Wiladams/LJIT2libc。否则,C头文件中的定义对我来说太多了。
输出在st_mode区域之前都是正常的。该区域的值为零。我用C语言进行了测试,一切都很好。因此,问题是LuaJIT的stat给出了错误结果。请建议我该怎么做。我花了一整天来解决这个问题。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我在
ffi.cdef类型声明中犯了一些错误。幸运的是,在luajit邮件列表的用户的帮助下,这个问题已经得到解决。简单来说:clang -E <some_c_file>.c命令在包含#include <sys/stat.h>的C源文件上进行操作,获得输出。struct stat定义。stat函数有太多级别的宏垃圾。最终,stat函数调用__xstat。对我来说,调用stat函数的唯一合理方式是使用syscall。Luaprint函数不知道cdata类型。而printf不知道Lua类型。但是luajit提供了一个很好且易于理解的方法,可以将常见的数据类型相互转换。