C++ 检测进程是否仍在运行
我需要检查具有给定句柄的进程是否仍在运行,我尝试使用以下代码执行此操作,但它总是在第二次返回时返回false,即使进程正在运行C++ 检测进程是否仍在运行,c++,windows,process,C++,Windows,Process,我需要检查具有给定句柄的进程是否仍在运行,我尝试使用以下代码执行此操作,但它总是在第二次返回时返回false,即使进程正在运行 bool isProcessRunning(HANDLE process) { if(process == INVALID_HANDLE_VALUE)return false; DWORD exitCode; if(GetExitCodeProcess(process, &exitCode) != 0) return f
bool isProcessRunning(HANDLE process)
{
if(process == INVALID_HANDLE_VALUE)return false;
DWORD exitCode;
if(GetExitCodeProcess(process, &exitCode) != 0)
return false;//always returns here
return GetLastError() == STILL_ACTIVE;//still running
}
您可以使用
bool isProcessRunning(HANDLE process)
{
return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT;
}
返回值
如果函数成功,则返回
值为非零
如果函数
失败,返回值为零。到
获取扩展错误信息,请致电
GetLastError
您可以使用
enumprocess()
在Windows上运行所有进程。
比如:
bool IsProcessRunning(int pid)
{
unsigned long processes[2048];
unsigned long num_proc = 0;
unsigned long needed = 0;
// assume that 2048 processes are enought
if (EnumProcesses(processes, sizeof(processes), &needed))
num_proc = needed / sizeof(DWORD);
for (int i = 0; i < num_proc; i++)
if (processes[i] == pid)
return true;
return false;
}
bool IsProcessRunning(int-pid)
{
无符号长进程[2048];
无符号长num_proc=0;
无符号long=0;
//假设2048个进程足够
if(枚举进程(进程、sizeof(进程)和所需进程))
num_proc=所需/sizeof(DWORD);
for(int i=0;i
我知道这有点晚了,但是如果您希望得到预期的结果,您的代码应该是这样读的
bool isProcessRunning(HANDLE process)
{
DWORD exitCodeOut;
// GetExitCodeProcess returns zero on failure
if( GetExitCodeProcess( process, &exitCodeOut ) == 0 )
{
// Optionally get the error
// DWORD error = GetLastError();
return false;
}
// Return if the process is still active
return exitCodeOut == STILL_ACTIVE;
}
如果您只有进程ID(PID),则此代码段将正常工作(SAN错误检查):
只需要添加一个无效的\u HANDLE \u值检查,因为该值报告了进程正在运行,但它甚至无效:)如果进程句柄打开,像WaitForSingleObject这样的API永远不会返回无效的\u HANDLE \u值,即使它被终止。句柄和基础对象必须保持打开状态,直到引用进程显式关闭(或这些进程终止)。你确定你没有试图在进程ID而不是句柄上调用它吗?我的意思是在WaitForSingleObject之前进行检查,以防进程尚未创建,所以句柄仍然是我初始化它的值,即无效的句柄值,因为将无效的句柄值传递给WaitForSingleObject总是超时(即无效句柄值似乎从未处于信号状态)。这不是一个答案。@gimpf它仍然可能有用,不管它有多复杂。但是效率非常低,因为它使用进程ID而不是句柄,这取决于一个固有的竞争条件。我想这可能有用,但可能只在边缘情况下。应该避免这种方法,因为它可能会使已退出的进程的VE。(这是一个有效的退出代码。)@HarryJohnston当且仅当该进程使用259作为退出代码时,是否正确?Microsoft建议不要将其作为错误代码。因为我正在检查的进程没有机会返回259(正如我编写的那样),这是一个完全可以接受的退出代码用法。这似乎是一个妖怪,只在您检查没有权限的进程的退出代码时才适用。(但是,了解并意识到这一点很好)在那个特定的场景中,这种方法可能是可以接受的。不过OP没有说他们正在检查的流程是否是他们自己的代码,而且你的回答也没有说这是一种要求……就个人而言,考虑到WaitForSingleObject的易用性,我不认为改用GetExitCodeProcess有什么好处。当您可以通过简单的方法消除风险时,可以使用WaitForSingleObject,也可以通过检查子程序的每个可能的退出路径(包括您可能正在使用的任何第三方库),那么,为什么要这样做呢?:-)只需尝试使用
WaitForSingleObject
,即使进程仍在启动,它也会返回WAIT_TIMEOUT,这可能是因为我们正在使用QSharedMemory
,它会锁定进程,使其无法接收事件(基本上它已经在等待了)。因此,在我们的特定用例中不可能使用WaitForSingleObject(p,0)
。优点是:-)我可能在最初实现该功能时遇到过这种情况,但忘记了选择GetExitCodeProcess
的具体原因。尽管如此,这是一个很有帮助的练习,希望对将来的人有所帮助。
bool isProcessRunning(DWORD processID)
{
if( HANDLE process = OpenProcess( PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID ) )
{
DWORD exitCodeOut;
// GetExitCodeProcess returns zero on failure
if( GetExitCodeProcess( process, &exitCodeOut ) != 0 )
{
// Return if the process is still active
return exitCodeOut == STILL_ACTIVE;
}
}
return false;
}