2011-12-12 108 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