【问题标题】:Executing a command from C++, What is expected in argv[0]?从 C++ 执行命令,argv[0] 中的预期是什么?
【发布时间】: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


    【解决方案1】:

    argv[0] 应该是您要运行的命令的完整路径。

    【讨论】:

    • 没有义务让它成为完整的路径名;实际上,该值根本不必与可执行文件的名称相关。如果它是方便的话,但你绝对不能依赖它作为完整的路径名。
    【解决方案2】:

    argv[0] 应该是程序名称。它被传递给程序的main 函数。一些程序根据argv[0] 是什么字符串来区分它们的行为。例如,如果使用sh 而不是bash 调用,GNU bash shell 将禁用它的一些功能。最好给它传递给path 的相同值。

    在 linux 中,argv[0]top 实用程序显示的进程名称(它可能通过读取 /proc/ 中的条目获得)

    【讨论】:

    • 如果 argv[0] 前面有一个破折号,大多数 shell 将运行配置文件,如 '-sh' 或 '-ksh'。这也适用于伪装成 'sh' 和自身的 'bash'。这是登录进程请求 shell 运行配置文件的方式。
    【解决方案3】:

    我知道这不是您要寻找的答案,但您这样做有什么具体原因吗?我问的原因是,人们通常使用system()execv() 运行的大多数(如果不是全部)操作都可以在 Windows 或 Unix 的库中使用,并且更安全、更快且不太可能遭受 circumstantial 错误。我的意思是,例如,当PATH 更改并且您的代码突然停止工作时。

    如果您要传递一个字符串,无论是全部还是部分并运行它,那么您也会让自己对通过输入可能具有破坏性的命令访问系统的用户开放。例如。假设您已经使用find /home -name 实现了文件搜索,并且您的用户输入:

    "%" -exec rm {} \;
    

    哎哟!

    【讨论】:

    • 这是一个家庭作业,我必须创建自己的简单外壳,并且需要使用 evecv();
    • 点了。也许不是家庭作业的最佳主题。大概你的导师会在某个时候涵盖防御性编程?如果不是,也许您可​​以/应该建议他/她这样做?无论如何,祝你好运 - 我希望他们在我上大学的时候有 stackoverflow!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    相关资源
    最近更新 更多