【发布时间】:2011-01-22 19:01:49
【问题描述】:
我正在使用execv() 从 /bin/ 运行命令,例如我的 c++ 程序中的“ls”、“pwd”、“echo”,我想知道我应该在 argv[0] 中提供什么值;
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
【问题讨论】:
标签: c++ linux argument-passing execv
我正在使用execv() 从 /bin/ 运行命令,例如我的 c++ 程序中的“ls”、“pwd”、“echo”,我想知道我应该在 argv[0] 中提供什么值;
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
【问题讨论】:
标签: c++ linux argument-passing execv
argv[0] 应该是您要运行的命令的完整路径。
【讨论】:
argv[0] 应该是程序名称。它被传递给程序的main 函数。一些程序根据argv[0] 是什么字符串来区分它们的行为。例如,如果使用sh 而不是bash 调用,GNU bash shell 将禁用它的一些功能。最好给它传递给path 的相同值。
在 linux 中,argv[0] 是 top 实用程序显示的进程名称(它可能通过读取 /proc/ 中的条目获得)
【讨论】:
-sh' 或 '-ksh'。这也适用于伪装成 'sh' 和自身的 'bash'。这是登录进程请求 shell 运行配置文件的方式。
我知道这不是您要寻找的答案,但您这样做有什么具体原因吗?我问的原因是,人们通常使用system() 或execv() 运行的大多数(如果不是全部)操作都可以在 Windows 或 Unix 的库中使用,并且更安全、更快且不太可能遭受 circumstantial 错误。我的意思是,例如,当PATH 更改并且您的代码突然停止工作时。
如果您要传递一个字符串,无论是全部还是部分并运行它,那么您也会让自己对通过输入可能具有破坏性的命令访问系统的用户开放。例如。假设您已经使用find /home -name 实现了文件搜索,并且您的用户输入:
"%" -exec rm {} \;
哎哟!
【讨论】: