使用luajit ffi将变量args转换为execvp的char*const[]

使用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的不同方式,并对其进行了略微扩展。另外,由于该类型,您无

给定exec这样的函数,如果参数数目未知,如何从luaffi调用它

功能原型为:

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")