使用 luajit ffi 将变量参数转换为 char* const[] for execvp



给定像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 的东西。 我该怎么做?

我想

我已经想通了,它似乎有效。

我查看了另一个库,发现了一种调用ffi.new的不同方式,并稍微扩展了一下。 另外,由于类型的原因,您无法直接转换字符串,因此我首先将其创建为普通的const char*。并传递长度 + 1(以空终止它)。 然后将 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
<</div> div class="one_answers">

不重铸:

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

相关内容

  • 没有找到相关文章

最新更新