C语言 如何执行运行命令?



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

我已经试过了,我一直得到错误

char *argv[] = {"ls", "-l", NULL};
int exec;
exec = execve("/tmp", argv, NULL);
printf("%dn", exec);
return (0);

您没有正确使用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):

RETURN VALUE
如果成功,execve()不返回,如果错误返回-1;errno被设置为表示错误。

如果execve调用成功,您的程序将被启动的程序(这里是ls)所替换,因此最后两行将不会执行

execve的第一个参数是要执行的程序的路径[1]

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

注意,我们必须提供二进制文件的完整路径。为了在需要时搜索PATH来避免这种情况,我们可以使用" "变体。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新