【问题标题】:Using luajit ffi to convert variable args to a char* const[] for execvp使用 luajit ffi 将变量 args 转换为 char* const[] 用于 execvp
【发布时间】:2016-06-01 03:41:05
【问题描述】:

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

【问题讨论】:

    标签: lua ffi luajit


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      没有重铸:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多