2016-06-01 133 views
1

给定一个像exec这样的函数,如果给定未知数量的参数,我如何从lua ffi调用它。使用luajit ffi为execvp将变量args转换为char * const []

的函数原型之中:

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

回答

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 

那么,上述确实有用。但停止工作。我一直收到“不良地址”错误。似乎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

没有重铸:

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") 
相关问题