我正在尝试使用execve()
在Linux上使用unistd.h
生成一个新进程。我试过传递以下参数execve("/bin/ls", "/bin/ls", NULL);
,但没有得到任何结果。我也没有出错,程序就退出了。有没有理由发生这种情况?我尝试以root用户身份启动它。我需要使用execve()
的原因是因为我试图让它在像这样的汇编调用中工作
program: db "/bin/ls",0
mov eax, 0xb
mov ebx, program
mov ecx, program
mov edx, 0
int 0x80
谢谢!
答案 0 :(得分:9)
您传递给execve
的论据是错误的。第二个和第三个都必须是一个带有NULL sentinel值的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;
}
当我运行它时,我确实得到了当前目录中的文件列表。
答案 1 :(得分: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
答案 2 :(得分:1)
再次尝试阅读man execve
。你传递错误的参数。特别注意第二个论点应该是什么。
此外,在strace
下运行您的程序可能会很有启发性。