我使用execv()
运行从/ bin中/命令,如“LS”,“PWD”,“回响”从我的C++程序,我想知道我应该argv中提供什么样的值[0];从C++执行命令,argv [0]中的期望值是什么?
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
我使用execv()
运行从/ bin中/命令,如“LS”,“PWD”,“回响”从我的C++程序,我想知道我应该argv中提供什么样的值[0];从C++执行命令,argv [0]中的期望值是什么?
const char * path = getPath();
char ** argv = getArgs();
execv(path,argv);
argv[0]
应该是程序名称。它传递给程序的main
函数。某些程序根据字符串argv[0]
的不同来区分它们的行为。例如,如果使用的不是sh
称为bash
的GNU bash
外壳将禁用它的一些特性。最好给与它通过path
相同的价值。
在linux下,argv[0]
是由top
实用程序(它有可能从阅读条目获取/proc/
)
argv [0]应该是要运行的命令的完整路径。
没有义务为它是完整的路径;的确,这个价值并不一定与可执行文件的名字有关。如果是的话,这很方便,但绝对不能依赖它作为完整的路径名。 – 2010-03-02 16:17:08
我知道,这是不是你要找的答案,但有没有具体显示的进程名你为什么这样做?我想问的原因是,大多数如果不是所有的人的行动通常与任何system()
或execv()
在Windows或Unix的库可用,更安全,更快捷,更不可能从间接错误遭受运行。我的意思是,例如,当PATH
更改并突然您的代码停止工作。
如果你正在传递一个字符串,无论是全部或部分,并运行它,那么你也会把自己暴露给通过输入命令,可能会损害获得访问系统的用户。例如。想象你已经实现了使用find /home -name
文件搜索和您的用户类型:
"%" -exec rm {} \;
哎哟!
这是一个家庭作业,我必须创建我自己的简单外壳,并且我被要求使用evecv(); – 2010-03-02 23:26:41
采取了点。这可能不是家庭作业最好的主题。据推测,你的导师在某个时候会涵盖防御性编程?如果不是,也许你可以/应该建议他/她这样做?无论如何,祝你好运 - 我希望他们在我上大学的时候可以使用计算器! – 2010-03-03 22:37:08
如果argv [0]前面有一个破折号,如''-sh''或''-ksh'',则大多数shell将运行该概要文件。这也适用于伪装成'sh'和'bash'。登录过程如何请求shell来运行配置文件。 – 2010-03-02 16:15:57