Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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++ 检测进程是否仍在运行_C++_Windows_Process - Fatal编程技术网

C++ 检测进程是否仍在运行

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

我需要检查具有给定句柄的进程是否仍在运行,我尝试使用以下代码执行此操作,但它总是在第二次返回时返回false,即使进程正在运行

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;
}