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

时间:2016-06-01 03:41:06

标签: lua ffi luajit

给定像exec这样的函数,如果给出一个未知数量的参数,如何从lua ffi调用它。

函数原型是:

int execv(const char *path, char *const argv[]);

function myexecv(...)
     local arg = { ... }
     local carg = ffi.new("char *const[?]", #arg)
     for i = 1, #arg do
        carg[i-1] = arg[i]
     end
     return ffi.C.execv(carg[0], carg)
end

哪个不起作用。

cannot convert 'string' to 'char *const'

我认为可能有一种简短的方法来初始化或创建我可以传递给argv的东西。我该怎么做?

2 个答案:

答案 0 :(得分:1)

我想我已经弄清楚它似乎有用了。

我查看了另一个库,发现了一种不同的方式来调用ffi.new并稍微扩展一下。另外因为你不能直接转换字符串,所以我首先将它创建为普通的const char *。并传递长度+ 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

嗯,以上确实在某些方面有效。但是停止了工作。我一直得到" Bad Address"错误。似乎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

答案 1 :(得分:1)

没有重铸:

{{1}}