Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 我可以使用boost库执行跨平台应用程序吗?_C++_Boost_Cross Platform - Fatal编程技术网

C++ 我可以使用boost库执行跨平台应用程序吗?

C++ 我可以使用boost库执行跨平台应用程序吗?,c++,boost,cross-platform,C++,Boost,Cross Platform,boost(c++)库中是否有WinAPI WinExec模拟?我需要从我的程序运行可执行文件,并将参数传递给它。我是否应该使用其他跨平台库来处理这个问题,或者处理我自己的程序编译什么? 系统()/,这是标准C++的一部分,有什么不对吗?请参阅。您可能想看看有关win32上popen()的问题:我相信有一个库正在尝试进入boost,名为boost.Process。您必须找到它的下载,可能是在sandbox或其他什么地方。重要信息:请参阅最后的POSIX系统更新 我的意见是,您应该使用您希望支持

boost(c++)库中是否有WinAPI WinExec模拟?我需要从我的程序运行可执行文件,并将参数传递给它。我是否应该使用其他跨平台库来处理这个问题,或者处理我自己的程序编译什么?

<代码>系统()/<代码>,这是标准C++的一部分,有什么不对吗?请参阅。

您可能想看看有关win32上popen()的问题:

我相信有一个库正在尝试进入boost,名为boost.Process。您必须找到它的下载,可能是在sandbox或其他什么地方。

重要信息:请参阅最后的POSIX系统更新

我的意见是,您应该使用您希望支持的各种平台提供的API/syscalls,或者使用某种抽象层(Noah Roberts提到的库可能是一种想法)来避免处理特定于平台的细节

我强烈反对使用
system
函数,因为它不打算启动您指定的进程,而是应该将您指定的字符串传递给“系统默认shell”或“命令处理器”(如果有)。这有几个缺点:

  • 资源浪费;您现在(通常)生成的不是一个流程,而是两个,其中一个(shell)对于您的最终目标(启动您想要的流程)是无用的。这通常可以忽略不计,但在进程不是轻量级对象(Windows)的系统上,如果它们在资源不足的情况下运行,这一点可能会很明显
  • 无用的混乱;我处理过的几个安全套件在未知/不受信任的进程启动新进程时发出警告;现在,安全套件将显示其中的两个警告,而不仅仅是显示一个警告(您正在使第一个警告变得非常不清楚)
  • 结果的不可预测性;与平台无关的
    系统
    的文档可以被替换为“未定义的行为”——实际上是这样的。我为什么这么说?因为:
    • 首先,甚至不能保证
      system
      在当前平台上有一定的意义,因为根本不可能有“默认shell”。但这是一个极端情况,通常不是问题,而且也很容易被发现(
      if(system(NULL)==0)
      没有shell);真正的问题是
    • 一般来说,您不知道什么shell是“默认shell”,以及它如何解析输入;在Linux上,它通常是
      /bin/sh
      更新:实际上,这是POSIX强制执行的,见下文,在Windows上,它可能是
      command.com
      以及
      cmd.exe
      ,在另一个操作系统上,它仍然是另一回事。因此,您不确定,例如,如何避开路径中的空格,或者是否应该引用路径;见鬼,你甚至不知道这样的shell是否需要一些特殊的命令来启动可执行文件
    • 更有趣的是:你甚至不知道调用是否真的被阻塞了:你知道当
      系统
      返回时,shell将被终止,但你不知道shell是否会等待生成的进程结束;具体示例:
      cmd.exe
      不会等待GUI可执行文件结束后再返回,而在Linux上,GUI可执行文件与所有其他可执行文件一样,没有这样的特殊处理。在这种情况下,您必须为Windows创建一个特例,并生成一个命令字符串,如
      /wait youexecutable.exe
      ——希望解释器的版本仍然(或者取决于Windows的版本)支持该语法。IIRC
      start
      在windows9x和windowsnt系列上有不同的选项,所以你甚至不能确定
    • 这还不够:您甚至不确定应用程序是否已启动:
      system
      返回值与命令解释器返回代码相关。就
      system
      而言,如果启动shell,则调用成功,并结束
      system
      认为的错误
    • 然后,您将看到shell的错误代码——关于这一点,我们同样一无所知。可能是上一个执行命令的错误代码的副本;可能是与shell相关的错误代码(例如,1=执行的最后一个命令,0=最后一个命令无效),可能是42。谁知道呢
因为在一个好的应用程序中,您至少希望知道调用是否阻塞/非阻塞,获得有意义的退出代码(您启动的应用程序实际返回的代码),确保应用程序是否已启动,在出现问题时有意义的错误代码,
系统
很可能不适合您的需要;要获得这些保证,您必须使用特定于平台的黑客攻击或不保证的假设,浪费
系统的所有跨平台“兼容性”

因此,我将再次声明:使用各种平台(例如,POSIX上的+和Windows上的+)提供的系统调用,这些平台确切地指定了它们保证做什么,或者使用第三方抽象代码;
系统
方式绝对不好


更新:自从我写下这个答案后,我了解到在POSIX系统上
系统
——特别是,它必须使用
/bin/sh-c命令
执行命令,直到shell进程终止为止

sh
行为,反过来;因此,在POSIX系统上,“结果的不可预测性”下列出的一些缺点不再适用:

  • 默认shell是指定的,因此,只要您使用POSIX保证的
    sh
    东西(例如no
    bash
    isms),您就安全了
  • 呼叫被阻塞
  • 如果您的命令格式正确,shell本身不会遇到问题,
    waitpid
    succeeds,…,您应该
那么,如果