Получить PID процесса, запущенного CreateProcess()

позвольте мне начать с того, что я не из C фон. Я разработчик PHP. Так что все, что я закодировал до сих пор, это взяв кусочки из других примеров и настроив их в соответствии с моими требованиями. Поэтому, пожалуйста, потерпите, если я задам слишком простые или очевидные вопросы.

Я FFmpeg используя CreateProcess() через

int startFFmpeg()
{
    snprintf(cmd, sizeof(cmd), "D:ffpmegbinffmpeg.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, но я не мог найти пример, показывающий, как его получить.

некоторые метаданные

OS:Windows 7
Язык:C
IDE:Dev C++

2 ответов


вытащить его из 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