2011-12-12 105 views
1

我試圖在Linux上使用execve()unistd.h產生一個新進程。我試過給它傳遞下面的參數execve("/bin/ls", "/bin/ls", NULL);但沒有結果。我也沒有得到一個錯誤,該程序剛剛退出。這是爲什麼發生這種情況的原因嗎?我試圖以root用戶和普通用戶身份啓動它。我需要使用execve()的原因是因爲我想獲得它在裝配呼叫工作,像這樣execve()無法在C中啓動程序

program: db "/bin/ls",0 

mov eax, 0xb 
mov ebx, program 
mov ecx, program 
mov edx, 0 
int 0x80 

謝謝!

回答

9

您傳遞給execve的參數是錯誤的。第二個和第三個必須是是一個帶空值標記值的char指針數組,而不是單個指針。

換句話說,是這樣的:

#include <unistd.h> 
int main (void) { 
    char * const argv[] = {"/bin/ls", NULL}; 
    char * const envp[] = {NULL}; 
    int rc = execve ("/bin/ls", argv, envp); 
    return rc; 
} 

當我跑,我確實得到當前目錄中的文件列表。

+0

Gotcha,'man execve'表示一個數組,我假設只是一個普通的字符串會做。獲得的教訓,謝謝! – user99545

1

嘗試再次閱讀man execve。你傳遞了錯誤的觀點。要特別注意第二個參數應該是什麼。

此外,在strace下運行您的程序可能會很有啓發性。

+0

'strace'給我'-1 EFAULT(錯誤地址)',我已經重新閱讀它的人的頁面,但我仍然感到困惑。我是否錯誤地傳遞了第二個參數? (過程參數) – user99545

2

man頁面,

int execve(const char *filename, char *const argv[], char *const envp[]); 

所以你的情況的問題是,你有沒有正確地傳遞第二和第三的說法。

/* execve.c */ 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int 
main(int argc, char *argv[]) 
{ 
    char *newargv[] = { NULL, "hello", "world", NULL }; 
    char *newenviron[] = { NULL }; 


newargv[0] = argv[1]; 

execve(argv[1], newargv, newenviron); 


} 
//This is a over-simplified version of the example in the man page 

運行此爲:

$ cc execve.c -o execve 
$ ./execve ls