2016-06-01 56 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")