C++ 系统(“foo.exe”)需要关闭foo才能继续我的程序
我不知道我的问题是否清楚,让我解释一下 我在我的C++ 系统(“foo.exe”)需要关闭foo才能继续我的程序,c++,windows,C++,Windows,我不知道我的问题是否清楚,让我解释一下 我在我的main()函数中调用此函数: system("foo.exe") 但是,为了执行以下命令,我首先需要手动关闭foo.exe窗口 我尝试使用: system("taskkill /F /im foo.exe") 但它不起作用 有人知道怎么做吗?一个简单的解决方案: std::system("start foo.exe") 如果您希望这样做奏效: system("foo.exe"); system("taskkill /F /im foo.
main()
函数中调用此函数:
system("foo.exe")
但是,为了执行以下命令,我首先需要手动关闭foo.exe
窗口
我尝试使用:
system("taskkill /F /im foo.exe")
但它不起作用
有人知道怎么做吗?一个简单的解决方案:
std::system("start foo.exe")
如果您希望这样做奏效:
system("foo.exe");
system("taskkill /F /im foo.exe");
它不能执行,因为第二个调用只会在第一次执行foo.exe
终止时发生。如果出于某种原因,您需要启动一个进程,然后在它自然终止之前杀死它(您可能真的不想这么做),那么您需要查看更复杂的Windows进程控制API,从CreateProcess开始。在Windows上,系统(“命令”)
启动cmd.exe/C命令的新进程
。/C
告诉cmd.exe
在命令完成时终止system()
等待cmd.exe
退出
在您的情况下,system(“foo.exe”)
正在等待cmd.exe/C foo.exe
退出,这反过来又在等待foo.exe
退出。这就是为什么在系统(“foo.exe”)
将控制权返回到代码之前必须关闭foo.exe
窗口的原因
您可以使用系统(“start foo.exe”)
,就像HolyBlackCat建议的那样system()
将等待cmd.exe/C start
退出,start
将不会等待foo.exe
退出,从而允许system(“start foo.exe”)
在foo.exe
仍在运行时返回代码
更好的解决方案是直接调用Win32 API函数,同时避免使用cmd.exe
:
#include <windows.h>
STARTUPINFO si = {};
si.cb = sizeof(si);
// populate si as desired...
PROCESS_INFORMATION pi = {};
if (CreateProcess("foo.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
// other commands while foo.exe is still running...
}
#包括
STARTUPINFO si={};
si.cb=sizeof(si);
//根据需要填充si。。。
进程信息pi={};
if(CreateProcess(“foo.exe”,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
//foo.exe仍在运行时的其他命令。。。
}
system()
在命令完成之前不会返回。如果您需要子进程,我建议您考虑而不是system
,我对否决票背后的想法感兴趣。我别无选择。为了解决一个物理问题,我需要调用另一个程序,叫做femm,用应力张量计算磁力。我不能在我的代码内完成它。我肯定会研究CreateProcesses以进一步编码,尽管您在描述您的问题方面真的很糟糕-我仍然不知道@HollyBlackCat的答案是如何解决问题的。它似乎是这样做的,因为系统(“start foo.exe”)不会等待foo.exe关闭。它只是启动exe,然后转到下一个命令。start foo.exe
执行批处理命令start
,然后在单独的非阻塞过程中执行其输入。基本上,这是一种非常迂回且昂贵的方法来做CreateProcess
,我不是反对者,但对这个解决方案的工作原理做一点背景解释不会有什么坏处。