启动Process并稍后识别它

Starting Process and identify it later

本文关键字:识别 Process 启动      更新时间:2023-10-16

现在我正在用c++编程一个类似cron的调度器。我的程序能够在特定时间启动作业并正确安排它们。给我留下麻烦的是检查一个过程是否仍然存在。

所以我有一张地图JobMap;其中填充了作为键的进程Handles和作为值的Jobs。我如何将这两种价值观联系起来?每当我尝试GetExitCodeProcess时,它永远不会返回STILL_ACTIVE。是否可以为流程设置一个唯一的令牌/密钥,以便我可以识别它并将其与作业关联起来?

任何想法都将是一个很大的帮助,非常感谢!

void Cron::CheckRunningJobs()
{
    DatNowObj Today;
    DWORD exitCode = 0;
   // now iterate through the executed jobs and check their state
    for(MC_STL_PTR(MapPtr,JobMap)) //MapPtr is a pointer for my map
    {
        DatStrNowObj Today; //gives actual date
        DWORD exitCode = 0;
        PROT()<<"Job Handle:"<<MapPtr->first <<"Job in Map: "<<MapPtr->second.Job->getDescription()<<endl;
        // store the exit code for later use
        MapPtr->second.exitCode = GetExitCodeProcess(MapPtr->first, &exitCode);
        if(GetExitCodeProcess(MapPtr->first, &exitCode) == STILL_ACTIVE)
        {
            PROT()<<"PROCESS STILL ACTIVE"<<endl;
        }
        else if(GetExitCodeProcess(MapPtr->first, &exitCode) == ERROR_INVALID_FUNCTION)
        {
            CloseHandle(MapPtr->first);
            continue;
        }
        else if(MapPtr->second.execTime)
        {
        }
        else if(GetExitCodeProcess(MapPtr->first, &exitCode) == 0)
        {
            CloseHandle(MapPtr->first);
            JobMap.erase(MapPtr);
            PROT()<<"Job in Map after Erase: "<<MapPtr->second.Job->getDescription() << "and Map size: " << JobMap.size()<<endl;
            continue;
        }
        else
        {
            PROT()<<"Error:"<<GetLastError()<<endl;
            continue;
        }
    }
}

请阅读user6545984链接的文档。你在这里似乎很混乱。

GetExitCodeProcess()返回一个BOOL,指示函数是否成功,而不是进程是否成功。您正试图使用常量将其与BOOL进行比较,就好像它是exitCode一样。但它们是不兼容的类型。即使他们没有,我也不知道你为什么要一遍又一遍地调用函数!

要获得退出代码,您需要传入一个LPDWORD指针来接收它。调用函数一次,将两个输出输入右侧的变量-一个返回值,一个输出参数-并对它们做出适当的响应。

所以,你至少需要改变这个

MapPtr->second.exitCode = GetExitCodeProcess(MapPtr->first, &exitCode);

类似

BOOL result = GetExitCodeProcess(MapPtr->first, &MapPtr->second.exitCode);

或者您想存储所述代码的其他地方-然后更新所有比较以匹配,如果需要,还可以将比较添加到result

BOOL WINAPI GetExitCodeProcess(
  _In_  HANDLE  hProcess,
  _Out_ LPDWORD lpExitCode
);

它不会直接返回退出代码。在GetExitCodeProcess 上了解更多信息