C++ 我可以使用boost库执行跨平台应用程序吗?
boost(c++)库中是否有WinAPI WinExec模拟?我需要从我的程序运行可执行文件,并将参数传递给它。我是否应该使用其他跨平台库来处理这个问题,或者处理我自己的程序编译什么? <代码>系统()/<代码>,这是标准C++的一部分,有什么不对吗?请参阅。您可能想看看有关win32上popen()的问题:我相信有一个库正在尝试进入boost,名为boost.Process。您必须找到它的下载,可能是在sandbox或其他什么地方。重要信息:请参阅最后的POSIX系统更新 我的意见是,您应该使用您希望支持的各种平台提供的API/syscalls,或者使用某种抽象层(Noah Roberts提到的库可能是一种想法)来避免处理特定于平台的细节 我强烈反对使用C++ 我可以使用boost库执行跨平台应用程序吗?,c++,boost,cross-platform,C++,Boost,Cross Platform,boost(c++)库中是否有WinAPI WinExec模拟?我需要从我的程序运行可执行文件,并将参数传递给它。我是否应该使用其他跨平台库来处理这个问题,或者处理我自己的程序编译什么? 系统()/,这是标准C++的一部分,有什么不对吗?请参阅。您可能想看看有关win32上popen()的问题:我相信有一个库正在尝试进入boost,名为boost.Process。您必须找到它的下载,可能是在sandbox或其他什么地方。重要信息:请参阅最后的POSIX系统更新 我的意见是,您应该使用您希望支持
system
函数,因为它不打算启动您指定的进程,而是应该将您指定的字符串传递给“系统默认shell”或“命令处理器”(如果有)。这有几个缺点:
- 资源浪费;您现在(通常)生成的不是一个流程,而是两个,其中一个(shell)对于您的最终目标(启动您想要的流程)是无用的。这通常可以忽略不计,但在进程不是轻量级对象(Windows)的系统上,如果它们在资源不足的情况下运行,这一点可能会很明显
- 无用的混乱;我处理过的几个安全套件在未知/不受信任的进程启动新进程时发出警告;现在,安全套件将显示其中的两个警告,而不仅仅是显示一个警告(您正在使第一个警告变得非常不清楚)李>
- 结果的不可预测性;与平台无关的
的文档可以被替换为“未定义的行为”——实际上是这样的。我为什么这么说?因为:系统
- 首先,甚至不能保证
在当前平台上有一定的意义,因为根本不可能有“默认shell”。但这是一个极端情况,通常不是问题,而且也很容易被发现(system
没有shell);真正的问题是if(system(NULL)==0)
- 一般来说,您不知道什么shell是“默认shell”,以及它如何解析输入;在Linux上,它通常是
更新:实际上,这是POSIX强制执行的,见下文,在Windows上,它可能是/bin/sh
以及command.com
,在另一个操作系统上,它仍然是另一回事。因此,您不确定,例如,如何避开路径中的空格,或者是否应该引用路径;见鬼,你甚至不知道这样的shell是否需要一些特殊的命令来启动可执行文件李>cmd.exe
- 更有趣的是:你甚至不知道调用是否真的被阻塞了:你知道当
系统
返回时,shell将被终止,但你不知道shell是否会等待生成的进程结束;具体示例:
不会等待GUI可执行文件结束后再返回,而在Linux上,GUI可执行文件与所有其他可执行文件一样,没有这样的特殊处理。在这种情况下,您必须为Windows创建一个特例,并生成一个命令字符串,如cmd.exe
——希望解释器的版本仍然(或者取决于Windows的版本)支持该语法。IIRC/wait youexecutable.exe
在windows9x和windowsnt系列上有不同的选项,所以你甚至不能确定start
- 这还不够:您甚至不确定应用程序是否已启动:
返回值与命令解释器返回代码相关。就system
而言,如果启动shell,则调用成功,并结束system
认为的错误李>system
- 然后,您将看到shell的错误代码——关于这一点,我们同样一无所知。可能是上一个执行命令的错误代码的副本;可能是与shell相关的错误代码(例如,1=执行的最后一个命令,0=最后一个命令无效),可能是42。谁知道呢李>
- 首先,甚至不能保证
系统
很可能不适合您的需要;要获得这些保证,您必须使用特定于平台的黑客攻击或不保证的假设,浪费系统的所有跨平台“兼容性”
因此,我将再次声明:使用各种平台(例如,POSIX上的+和Windows上的+)提供的系统调用,这些平台确切地指定了它们保证做什么,或者使用第三方抽象代码;系统
方式绝对不好
更新:自从我写下这个答案后,我了解到在POSIX系统上
系统——特别是,它必须使用/bin/sh-c命令
执行命令,直到shell进程终止为止
sh
行为,反过来;因此,在POSIX系统上,“结果的不可预测性”下列出的一些缺点不再适用:
- 默认shell是指定的,因此,只要您使用POSIX保证的
东西(例如nosh
isms),您就安全了李>bash
- 呼叫被阻塞李>
- 如果您的命令格式正确,shell本身不会遇到问题,
succeeds,…,您应该waitpid