shell execve如何运行命令?

2izufjch  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(203)

我尝试使用execve运行命令:ls -l /tmp,我熟悉系统调用的用法,但不知道它如何运行命令。
我已经尝试过了,但总是出错

char *argv[] = {"ls", "-l", NULL};

int exec;

exec = execve("/tmp", argv, NULL);
printf("%d\n", exec);
return (0);
cvxl0en2

cvxl0en21#

你没有正确使用execve。第一个参数必须是可执行路径。
所以你的代码应该是

int  main(void) {
    char *argv[] = {"ls", "-l", "/tmp", NULL};

    execve("/bin/ls", argv, NULL); 
    // Or  "/usr/bin/ls", depending where  
    //    is stored 'ls' on your system

    // On success theses lines are not reached
    perror("execve failed");

    return 0;
}

请注意(来自man execve):
返回值
成功时,execve()不返回,错误时返回-1,并设置errno以指示错误。
如果execve调用成功,您的程序将被已启动的程序(此处为ls)替换,因此最后两行将不会执行

qoefvg9y

qoefvg9y2#

execve的第一个参数是要执行的程序的路径。

char *argv[] = { "ls", "-l", "/tmp", NULL };
execve( "/usr/bin/ls", argv, NULL );

请注意,我们必须提供二进制文件的完整路径。为了在需要时通过搜索PATH来避免这种情况,我们可以使用“p”变量之一来代替。

char *argv[] = { "ls", "-l", "/tmp", NULL };
execvpe( argv[0], argv, NULL );         # execvpe is a GNU extension.

envp参数传递NULL不是标准的。在Linux上,这会导致新程序具有空环境,这不太可能是这里所需要的。

char *argv[] = { "ls", "-l", "/tmp", NULL };
execvp( argv[0], argv );

最后,exec*的作用是改变当前进程执行的程序。因此,它只在出错时返回,并且总是在出错时返回-1。打印这个没有用。要打印错误消息,可以使用perror
1.要设置用作当前工作目录的路径,请在exec*之前使用chdir

qlfbtfca

qlfbtfca3#

execve的第一个参数必须是要执行的程序的路径:

exec = execve("/bin/ls", argv, NULL);

第二个参数argv必须是所有参数的列表:

char *argv[] = {"ls", "-l", "/tmp", NULL};

相关问题