detener - ver procesos de un usuario linux
Obtenga el PID del proceso iniciado por CreateProcess() (2)
Es posible que GetProcessId()
utilizar la función api win32 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 */
Para obtener detalles, consulte aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/ms683215%28v=vs.85%29.aspx
Permítanme comenzar declarando que no soy de origen C
Soy un desarrollador de PHP. Entonces, todo lo que he codificado hasta ahora es tomando fragmentos de otros ejemplos y ajustándolos para cumplir con mis requisitos. Así que por favor tengan paciencia si les hago preguntas demasiado básicas u obvias.
Estoy comenzando FFmpeg
usando CreateProcess()
través
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;
}
Lo que tengo que hacer es obtener el PID
de ese proceso y luego verificarlo más tarde para ver si sigue funcionando después de un tiempo. Esto es básicamente lo que estoy buscando:
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;
}
Hice algunas investigaciones y descubrí que PID
se devuelve dentro de PROCESS_INFORMATION
, pero no pude encontrar un ejemplo que muestre cómo recuperarlo.
Algunos metadatos
Sistema operativo: Windows 7
Idioma: C
IDE: Dev C ++
Tírelo de la estructura PROCESS_INFORMATION que pasa como el último parámetro para CreateProcess()
, en su caso pi.dwProcessId
Sin embargo, para comprobar si aún se está ejecutando, es posible que desee simplemente esperar en el identificador del proceso.
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;
}
En tu main()
lanzamiento main()
puedes hacer algo como ...
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;
}