使用 luajit ffi 将变量 args 转换为 char* const[] for execvp
Using luajit ffi to convert variable args to a 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(以 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
没有重铸:
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")
给定一个像 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(以 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
没有重铸:
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")