Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++ 系统(“foo.exe”)需要关闭foo才能继续我的程序_C++_Windows - Fatal编程技术网

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
,我不是反对者,但对这个解决方案的工作原理做一点背景解释不会有什么坏处。