Boost (C++)库中是否有任何类似于WinAPI WinExec的功能?我需要从我的程序中运行可执行文件,并向其传递参数。我应该使用其他跨平台库来处理这个问题,还是自己处理编译程序所需的操作系统?
Boost (C++)库中是否有任何类似于WinAPI WinExec的功能?我需要从我的程序中运行可执行文件,并向其传递参数。我应该使用其他跨平台库来处理这个问题,还是自己处理编译程序所需的操作系统?
system
函数,因为它不是用于启动您指定的进程,而是应将您指定的字符串传递给“系统默认shell”或“命令处理器”(如果有)。这有几个缺点:
system
的文档可以被替换为 "未定义行为" 而没有太大的损失 - 实际上 就是这样。为什么这么说?因为:
system
具有某种意义,因为根本没有 "默认 shell"。但这是一个极端情况,通常不是问题 - 也很容易解决 (if(system(NULL)==0)
就没有 shell);真正的问题是/bin/sh
command.com
以及 cmd.exe
,在其他操作系统上,它仍然是其他内容。因此,您不确定例如应该如何转义路径中的空格,或者是否应该引用路径;好吧,您甚至不知道这样的 shell 是否需要某些特殊命令才能启动可执行文件!system
返回 shell 将被终止,但您不知道 shell 是否等待出现的进程结束;具体例子:在 Windows 上,cmd.exe
在返回之前不会等待 GUI 可执行文件结束,而在 Linux 上,GUI 可执行文件与其他所有可执行文件一样运行,不会接受特殊处理。在这种情况下,您必须为 Windows 创建一个特殊情况,并创建一个命令字符串,例如:start /wait youexecutable.exe
- 希望解释器版本仍然(或尚未,取决于 Windows 版本)支持该语法。我IRC start
在 Windows 9x 和 Windows NT 家族上有不同的选项,因此您甚至不能确定那个。system
的返回值相对于命令解释器的返回代码。就 system
而言,如果启动了 shell 则调用成功,这是 system
认为的错误的结束。system
很可能不适合您的需求;要获得任何这些保证,您必须使用特定于平台的技巧或非保证假设,浪费了所有跨平台的“兼容性”。所以,我再次声明:请使用各个平台提供的系统调用(例如,在 POSIX 上是 fork+exec,在 Windows 上是 CreateProcess),它们会明确指定它们保证的内容,或者使用第三方抽象代码;system
的方式绝对不好。
system
的规定要好得多-特别是,它被指定为将使用/bin/sh -c command
执行命令,并阻塞直到shell进程终止。
sh
行为,反过来由POSIX的几种方式规定;因此,在POSIX系统上,“结果不可预测”下列出的一些缺点不再适用:
sh
内容(例如没有bash
主义),您就是安全的;waitpid
成功,...,您应该获得已执行程序的错误代码副本因此,如果您运行在POSIX上,则情况要少得多;如果您必须可移植,请继续避免使用system
。
system()
是标准C++的一部分,但它有什么问题呢?请参见http://www.cplusplus.com/reference/clibrary/cstdlib/system。
有一个我认为正在尝试进入Boost的库叫做Boost.Process。你需要找到它的下载链接,可能在沙盒或其他地方。