从其他程序发送可执行文件的参数

时间:2014-05-15 13:45:31

标签: c++ command-line system

我知道这可以使用平台的 system()实现轻松完成。但是,从我使用system阅读的内容来看,通常不是最好的方法,并且可能导致安全性方面的缺陷。是否有针对此类问题的不同行业标准方法?用户可以使用哪些选项来执行此类操作?

我对C / C ++中的实现特别感兴趣,但我不认为这种类型的东西会依赖于语言;我怀疑它应该是特定于平台的。

3 个答案:

答案 0 :(得分:2)

您可能正在寻找标准的POSIX函数forkexec*。这适用于类Unix平台(Linux和Mac)。

在Windows上,有CreateProcess API。

forkexec有点奇怪,因为fork完全复制了您当前的流程,并为每个副本返回不同的结果。然后,程序的新副本应设置任何所需的设置(关闭不应在两个程序中打开的文件,更改环境变量等),最后调用其中一个exec函数来替换该过程使用指定的程序(同时保持当前打开的文件描述符等)。

答案 1 :(得分:2)

您在system中提到的安全问题是system使用系统的shell来执行程序并解析其参数,如果您不小心, shell可以做你不想要的事情。 (例如," ls" +参数似乎无害,但如果参数为&#34 ;; rm -rf / *"),它可以删除数据。

如果您控制参数,或者您要小心将参数中的任何shell元字符转义为系统,那么您应该没问题,尽管它是最可靠的避免它。

为了避免安全问题,请使用一种方法来生成一个程序,该程序允许您指定已经解析的 list 参数,而不是指定必须解析以提取参数的字符串:< / p>

  • 使用POSIX,fork然后调用其中一个exec函数。
  • 在Windows上,使用CreateProcess
  • 使用跨平台库函数,例如Apache Portable Runtime&#39; apr_proc_create

这些完全匹配系统()的行为(系统,例如,在信号处理和返回值方面做了一点),但他们是关闭。

答案 2 :(得分:1)

您可能已经看过它,但fork()exec通常是Linux编程中的选择,但对于Windows,您可以必须使用OS API来创建新进程。对于较小的项目,system()仍然是一个不错的选择,因为它们通常不会遇到与大名称软件相同的恶意问题。它还原生等待子应用程序在继续执行父程序之前返回,如果您使用外部二进制文件运行计算或其他内容并且您将获得返回,这可能是一个很好的特性值。

很多人会告诉你使用system()是错误的,但事实并非如此。由于其固有的问题,它在专业市场上不赞成,但除此之外它也有效。