VC++ std::system() API 在调用 CMD.exe 后立即返回
Posted
技术标签:
【中文标题】VC++ std::system() API 在调用 CMD.exe 后立即返回【英文标题】:VC++ std::system() API to return back immediately after calling CMD.exe 【发布时间】:2014-12-09 10:56:47 【问题描述】:我知道 system() 内部调用“CreateProcess()”。
但从应用程序的角度来看,我发现它与它的用法有 1 个主要区别。 让我们看下面的示例代码sn-p。
VC++代码sn-p::
Main()
//Line 1 code....
//Line2 code.....
............
CreateProcess(); // Used to launch some app which needs to be kept running till the entire //program finishes.
LaunchWindowsMediaPlayer();
...
Main()
//Line 1 code....
//Line2 code.....
............
std::system(); // // Same as above -- Used to launch some app which needs to be kept running //till the entire program finishes.
LaunchWindowsMediaPlayer();
...
CreateProcess() 用法:
如第一个代码 sn-p 中给出的,如果我在此代码中调用“CreateProcess(),那么在启动应用程序 uisng CreateProcess() 后,控件会立即进入下一行并调用 LaunchWindowsMediaPlayer();。
但在 system()(第二个代码 sn-p)的情况下,只有在 system(0 应该执行的操作完成后,控制才从 system() 返回。
但是假设您有一个用例,其中您需要运行一些需要在整个代码中保持运行的帮助应用程序,那么使用 system() API 是不可能的。
有没有办法使用 system() API 实现这一点?
【问题讨论】:
【参考方案1】:使用 ShellExecuteEx() API 代替 system()。
【讨论】:
【参考方案2】:这取决于底层系统(例如 Windows、Unix 等)。库函数system
将字符串传递给命令解释器,然后命令解释器根据其约定解释参数。在 Windows 中,这通常通过使用命令 start
来完成,因此您将通过 "start /B mycommand args"
而不是传递 "mycommand args"
; /B
是为了防止创建新窗口。 (请注意,我实际上并没有尝试过;我在这个领域的经验是在 Unix 中,在命令中添加 &
就足够了。但根据文档,它应该可以工作。)
【讨论】:
有没有办法让 std::system() 在 Windows 环境中返回?我应该如何从我的应用程序代码中控制它,我只能控制使用参数调用 std::system() ? @codeLover 我刚才说的:在传递给std::system
的命令前加上"start /B"
。
system()
生成一个新进程,因此函数将立即返回。如果你想控制这个新进程,你必须重定向它的标准输入和输出。
system()
创建一个新进程,它是(或应该是)命令解释器; system
的参数被传递给这个命令解释器。这意味着您可以在命令解释器中执行的任何操作都可以在 system()
中完成。是否重定向标准输入和输出取决于您想要做什么(但您可以,就像您可以从命令行重定向它们一样)。
"在调用 CMD.exe 之后"在标题中将问题指向了 Windows 世界。 CreateProcess 也是 Windows API。标识符的样式也是非 Unix(不是全小写的 create_process())。以上是关于VC++ std::system() API 在调用 CMD.exe 后立即返回的主要内容,如果未能解决你的问题,请参考以下文章
std::system_clock 和 std::steady_clock 之间的区别?