创建调用另一个可执行文件的可执

时间:2014-05-15 09:41:17

标签: c++ linux gcc

我想创建一个小应用程序,为不同的输入参数多次运行另一个应用程序。

  1. 这已经完成了吗?
  2. 每次通话使用system("myAp param")是否有误(当然,param值不同)?
  3. 我在Linux-Ubuntu上使用kdevelop。

    从您的评论中,我理解而不是:

    system("path/to/just_testing p1 p2");
    

    我将使用:

    execl("path/to/just_testing", "path/to/just_testing", "p1", "p2", (char *) 0);
    

    这是真的吗?您是说execlsystem更安全,最好使用?

2 个答案:

答案 0 :(得分:3)

在非专业领域,使用system()是完全可以接受的,但要注意,人们总会告诉你它是错误的。"没错,这是一种解决问题的方法,而不会太复杂。它有点草率,是的,但肯定仍然可用(如果不那么便携)选项。 system()调用返回的数据将是您正在调用的应用程序的返回值。根据您帖子中的有限信息,我认为您真正想知道的是。

答案 1 :(得分:3)

系统与执行之间的差异

  • system()将调用默认命令shell,它将执行作为参数传递的命令。

    你的程序将停止,直到命令执行,然后它继续。

    你得到的值不是关于命令本身的成功,而是关于命令shell的正确打开。

    system()的加号是part of the standard library

  • 使用exec(),您的流程(调用流程)被替换。此外,您无法调用脚本或内部命令。您可以遵循常用的技巧:Differences between fork and exec

所以它们完全不同(有关详细信息,请参阅:Difference between "system" and "exec" in Linux?)。

POSIX spawn()system()之间的正确比较。 spawn()更复杂,但它允许读取外部命令的返回码。

安全

system()(或popen())可能存在安全风险,因为可以修改某些环境变量(例如$IFS / $PATH),以便您的程序执行外部程序你从来没有想过它(即指定一个没有路径名的命令,并且攻击者可以访问命令处理器路径名解析机制。)

system()函数也可能导致可利用的漏洞:

  • 传递源自受污染源的未经过清理或未正确清理的命令字符串;
  • 如果指定了可执行文件的相对路径,则攻击者可以访问当前工作目录的控制权;
  • 如果指定的可执行程序可能被攻击者欺骗。

有关详细信息:ENV33-C. Do not call system()

无论如何......我喜欢Somberdon的回答。