获取由CreateProcess()启动的进程的PID

让我开始说,我不是从C背景。 我是一名PHP开发人员。 所以到目前为止,我所编写的所有内容都是通过从其他示例中抽取一些东西,并对其进行微调以满足我的要求。 所以如果我提出过于基本或明显的问题,请耐心等待。

我开始使用CreateProcess()通过FFmpeg

 int startFFmpeg() { snprintf(cmd, sizeof(cmd), "D:\\ffpmeg\bin\ffmpeg.exe -i D:\\video.mpg -r 10 D:\\frames"); PROCESS_INFORMATION pi; STARTUPINFO si={sizeof(si)}; si.cb = sizeof(STARTUPINFO); int ff = CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); return ff; } 

我需要做的是获得该进程的PID ,然后再检查是否在一段时间后仍然运行。 这基本上是我要找的:

 int main() { int ff = startFFmpeg(); if(ff) { // great! FFmpeg is generating frames // then some time later if(<check if ffmpeg is still running, probably by checking the PID in task manager>) // <-- Need this condition { // if running, continue } else { startFFmpeg(); } } return 0; } 

我做了一些研究,发现PID是在PROCESS_INFORMATION返回的,但我找不到一个示例来展示如何获取它。

一些元数据

操作系统: Windows 7
语言: C
IDE: Dev C ++

从你传递的PROCESS_INFORMATION结构中把它作为CreateProcess()的最后一个参数,在你的情况下pi.dwProcessId

但是,要检查它是否仍在运行,您可能需要等待进程句柄。

 static HANDLE startFFmpeg() { snprintf(cmd, sizeof(cmd), "D:\\ffpmeg\bin\ffmpeg.exe -i D:\\video.mpg -r 10 D:\\frames"); PROCESS_INFORMATION pi = {0}; STARTUPINFO si = {0}; si.cb = sizeof(STARTUPINFO); if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) { CloseHandle(pi.hThread); return pi.hProcess; } return NULL; } 

在你启动main()你可以做一些像…

 int main() { HANDLE ff = startFFmpeg(); if(ff != NULL) { // wait with periodic checks. this is setup for // half-second checks. configure as you need while (WAIT_TIMEOUT == WaitForSingleObject(ff, 500)) { // your wait code goes here. } // close the handle no matter what else. CloseHandle(ff); } return 0; } 

你可能想使用win32 API函数GetProcessId()

 #include <windows.h> ... BOOL bSuccess = FALSE; LPTSTR pszCmd = NULL; PROCESS_INFORMATION pi = {0}; STARTUPINFO si = {0}; si.cb = sizeof(si); pszCmd = ... /* assign something useful */ bSuccess = CreateProcess(NULL, pszCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); if (bSuccess) { DWORD dwPid = GetProcessId(pi.hProcess); ... } else ... /* erorr handling */ 

详情请看这里: http : //msdn.microsoft.com/en-us/library/windows/desktop/ms683215%28v=vs.85%29.aspx