Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;:什么是跨平台和安全的系统(…)的替代方案? < >我想在C++中使用系统(…)来执行另一个可执行文件。经过一些研究,似乎每个人都认为系统(…)是有史以来最糟糕的事情,除非他们绝对必须使用它,否则任何人都不应该使用它,因为它是 资源密集型 不保证在所有平台上都能工作 反病毒软件通常认为它是恶意的 容易被利用/可能无意中启动错误的程序_C++_Linux_Cross Platform_System_Executable - Fatal编程技术网

C++;:什么是跨平台和安全的系统(…)的替代方案? < >我想在C++中使用系统(…)来执行另一个可执行文件。经过一些研究,似乎每个人都认为系统(…)是有史以来最糟糕的事情,除非他们绝对必须使用它,否则任何人都不应该使用它,因为它是 资源密集型 不保证在所有平台上都能工作 反病毒软件通常认为它是恶意的 容易被利用/可能无意中启动错误的程序

C++;:什么是跨平台和安全的系统(…)的替代方案? < >我想在C++中使用系统(…)来执行另一个可执行文件。经过一些研究,似乎每个人都认为系统(…)是有史以来最糟糕的事情,除非他们绝对必须使用它,否则任何人都不应该使用它,因为它是 资源密集型 不保证在所有平台上都能工作 反病毒软件通常认为它是恶意的 容易被利用/可能无意中启动错误的程序,c++,linux,cross-platform,system,executable,C++,Linux,Cross Platform,System,Executable,那么,我应该使用系统(…)的替代方案吗?我使用Linux,但我希望它是跨平台的(至少在Linux和Windows之间)。否;任何此类解决方案都必然会带来同样的风险系统明显有故障,因为它需要一个字符串参数,并使用该参数访问未知(不一定是标准化的)文件系统 但是,如果您需要以可移植的方式执行另一个可执行文件,则别无选择;在C/C++中没有进程概念(想想看,制作一个没有文件系统、没有其他可执行文件、甚至没有其他线程的程序是完全可以接受的) 以下是您可以采取的一些措施,以使其更安全地使用: 使用C++1

那么,我应该使用
系统(…)
的替代方案吗?我使用Linux,但我希望它是跨平台的(至少在Linux和Windows之间)。

否;任何此类解决方案都必然会带来同样的风险<代码>系统明显有故障,因为它需要一个
字符串
参数,并使用该参数访问未知(不一定是标准化的)文件系统

但是,如果您需要以可移植的方式执行另一个可执行文件,则别无选择;在C/C++中没有进程概念(想想看,制作一个没有文件系统、没有其他可执行文件、甚至没有其他线程的程序是完全可以接受的)

以下是您可以采取的一些措施,以使其更安全地使用:

  • 使用C++11中的文件系统API(如果您想要真正的可移植性,可以使用fopen)检查所提供的文件是否确实存在;系统可以执行shell代码,这可能很危险
  • 不要向字符串中添加特定于文件系统的内容(例如“./”),因为文件系统是不可移植的。如果要执行的程序与当前正在执行的程序位于同一目录中,则应该没有问题
  • 使用Posix(如果无法保证windows的可移植性),并使用fork/exec。那你就有更多的控制权了

  • 如果“可移植”意味着“可移植到一些特定的平台,而不是深奥的平台”,也可以使用它。

    如果您的目标只是同步执行子流程,
    系统
    真的不是一个坏赌注。它是在C89中定义的,因此具有很高的可移植性,除非您需要运行大量的子流程,否则性能不一定是问题

    是的,您必须注意安全问题:您应该清除环境变量,并始终确保使用完整路径(如果可能)执行流程,以避免路径攻击。此外,在构建
    系统
    命令时,如果没有正确的转义,请不要使用外部输入


    如果小心使用,它是运行外部程序的一种好的、可移植的方式

    对于跨平台工作,
    system()
    是可移植的(它是标准C,因此也是标准C++)。任何替代方案都是特定于平台的。“不保证在所有平台上都能工作”的评论很奇怪;现在还不清楚这是什么意思。如果使用大量元字符(I/O重定向、引号等)组成复杂的命令行,则会限制命令跨平台工作的机会。但是对于带有简单参数的简单命令,它可以正常工作。至于启动错误的程序,这取决于您如何生成命令名,但细节是特定于平台的。@JonathanLeffler那么您认为我可以只使用
    system()
    ?它是否会降低已启动应用程序的性能?
    系统
    不可移植;完全有可能(也可以)忽略它,在不同的平台上以不同的方式执行它,并发生各种不良副作用!它调用的是“命令处理器”,它很可能不存在(例如,在嵌入式系统上)。@Alice但如果我知道我将使用的所有平台都有命令处理器,该怎么办?@gragas:这取决于你计划做什么。如果您只是想用简单的参数运行一个简单的程序,并且您确保这是您要做的(通过验证任何用户输入以及环境),那么您可以使用
    system()
    。另一种方法是创建一个更合适的接口,并为每个平台分别实现它——包含代码的可移植性,该代码或多或少地作为
    system()
    的代理。但是,您需要仔细定义该接口。例如,您可能决定使用
    intalt\u系统(char**argv)而不是单个字符串。请小心存在性检查。以跨平台的方式防范TOCTTOU攻击并非易事。此外,Windows不支持POSIX。它有时支持POSIX的一个子集,但法规遵从性肯定是参差不齐的。而且Cygwin并不是一个理想的可移植性解决方案。@nneonneo无论如何,使用这个系统是不可能有任何信心的。正如我明确提到的,“如果不能保证windows的可移植性”,它是不可移植的;在windows和linux之间,完全不同的shell系统可能导致难以诊断的行为。即使在Dash和Bash之间,也有一大堆错误需要处理。只有以极其有限的方式使用它(并注意到任何可能的系统差异),才能有效地使用它。几乎不可移植。@Alice:那么你会建议什么更可移植——最好也是标准化的?它比任何其他方法都更可移植。这就是我要说的。如果你想放弃可移植性,那么我当然同意有更好的方法来替代
    系统
    @JonathanLeffler我所说的任何一点都不意味着更具可移植性或标准化的解决方案。没有可移植的解决方案。请同意nneonneo。问题是标记C++。不包括8051个微控制器和ILK,嵌入式C++是Linux /VxWorks等。他们都有
    系统
    ,甚至嵌入式系统也比安卓简单得多。见鬼,甚至Symbian也有
    系统
    (在P.I.P.S.库中)