Получить 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