使用luajit ffi将变量args转换为execvp的char*const[]
给定exec这样的函数,如果参数数目未知,如何从luaffi调用它 功能原型为:使用luajit ffi将变量args转换为execvp的char*const[],lua,ffi,luajit,Lua,Ffi,Luajit,给定exec这样的函数,如果参数数目未知,如何从luaffi调用它 功能原型为: int execv(const char *path, char *const argv[]); i、 e 这不管用 cannot convert 'string' to 'char *const' 我想可能有一种捷径可以初始化或创建我可以传递到argv的东西。我该怎么做呢?我想我已经弄明白了,而且似乎很管用 我查看了另一个库,发现了一种称为ffi.new的不同方式,并对其进行了略微扩展。另外,由于该类型,您无
int execv(const char *path, char *const argv[]);
i、 e
这不管用
cannot convert 'string' to 'char *const'
我想可能有一种捷径可以初始化或创建我可以传递到argv的东西。我该怎么做呢?我想我已经弄明白了,而且似乎很管用 我查看了另一个库,发现了一种称为ffi.new的不同方式,并对其进行了略微扩展。另外,由于该类型,您无法直接转换字符串,因此我首先将其创建为普通常量字符*。并传递长度+1(以null终止)。然后将arg作为初始值设定项传递。 然后在调用真正的execv之前将其重铸为正确的类型
function myexecv(...)
local arg = {...}
arg = ffi.new("const char*[?]", #arg+1, arg)
arg = ffi.cast("char *const*", arg)
return ffi.C.execv(arg[0], arg)
end
好吧,上面提到的确实在某个时候起了作用。但是停止了工作。我不断收到“坏地址”错误。ffi.new的复制操作似乎没有按预期工作。因此,我将代码更改为以下内容,这确实可以可靠地工作
function myexecv(...)
local arg = {...}
local argv = ffi.new("const char*[?]", #arg+1, arg)
argv[#arg] = nil
return ffi.C.execv(argv[0], argv)
end
无需重铸:
local ffi = require"ffi"
ffi.cdef"int execv(const char*path, const char*const argv[]);"
local function myexecv(...)
local arg = {...}
arg = ffi.new("const char*[?]", #arg+1, arg)
return ffi.C.execv(arg[0], arg)
end
myexecv("/bin/ls", "-l")
local ffi = require"ffi"
ffi.cdef"int execv(const char*path, const char*const argv[]);"
local function myexecv(...)
local arg = {...}
arg = ffi.new("const char*[?]", #arg+1, arg)
return ffi.C.execv(arg[0], arg)
end
myexecv("/bin/ls", "-l")