我想创建一个小应用程序,为不同的输入参数多次运行另一个应用程序。
system("myAp param")
是否有误(当然,param
值不同)?我在Linux-Ubuntu上使用kdevelop。
从您的评论中,我理解而不是:
system("path/to/just_testing p1 p2");
我将使用:
execl("path/to/just_testing", "path/to/just_testing", "p1", "p2", (char *) 0);
这是真的吗?您是说execl
比system
更安全,最好使用?
答案 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的回答。