Как я могу создать процесс, который живет только для данной продолжительности

У меня есть родительский процесс, и я хотел бы порождать дочерний процесс на определенную продолжительность (скажем, N миллисекунд). Я делаю это в C ++ (и Windows).

Могу ли я предоставить какой-то параметр CreateProcess что убьет его через некоторое время и вернет управление родительскому приложению? Если нет, есть ли другой способ сделать это?

0

Решение

Могу ли я предоставить какой-нибудь параметр для CreateProcess …?

Да, вы можете передать желаемое duration (N) с параметром lpCommandLine к процессу, который будет начат.

Дочерний процесс может разобрать lpCommandLine и установить таймер с нужным
duration, Этот таймер может быть, например, Таймер ожидания или просто нить с

Sleep(duration);               // waits the duration
ExitProcess(GetLastError());   // exits the "remote" process

Поток (поток внутри дочернего процесса) завершает весь дочерний процесс после duration, Идея WaitableTimer потребует частого вызова функции ожидания. Увидеть Использование ожидаемых объектов таймера для деталей.

Но: Родительский процесс будет оставаться «под контролем» все время.
Тем не мение: Вы можете дополнительно
введите состояние ожидания в родительском процессе, используя функцию ожидания (например, WaitForSingleObject, ожидание дескриптора дочерних процессов на самом деле спящего родительского процесса, пока дочерний процесс не завершится. Сверху вы можете оценить возвращаемое значение дочернего процесса путем вызова Функция GetExitCodeProcess.

Описанные схемы гарантируют, что желаемый duration лучше всего выполняется, однако вы также можете контролировать duration из родительского процесса с помощью именованного события. Увидеть Использование объектов событий для деталей. При таком подходе родительский процесс может установить событие, когда duration «потребляется». Дочерний процесс ожидает этого события и завершается, когда событие было установлено. Этот подход может быть немного менее точным, так как родитель не совсем знает, когда ребенок duration началось.

Пример с ожидаемым таймером:

Родительский процесс:

...
#define CHILD_DURATION 2000  // 2000 ms

HANDLE hProcess;
char ChildName[MAX_PATH];
char CommandLine[MAX_PATH];

sprintf_s(ChildName,MAX_PATH,"MyChild.exe");
sprintf_s(CommandLine,MAX_PATH,"%d",CHILD_DURATION);

// start the child
hProcess = CreateProcess(ChildProcessName,CommandLine,....
if (0 == hProcess)
{
// error with process creation
printf("CreateProcessfailed (%d)\n", GetLastError());
return GetLastError();
}

// and wait for it to finish
if (WAIT_OBJECT_0 == WaitForSingleObject(hProcess,INFINITE)
{
// child finished
} else
{
// error with wait
printf("WaitForSingleObject failed (%d)\n", GetLastError());
return GetLastError();
}
...

Дочерний процесс:

int main(int argc, char * argv[])
{

HANDLE hWaitableTimer CreateWaitableTimer(NULL,TRUE,NULL);
if (NULL == hWaitableTimer)
{
printf("CreateWaitableTimer failed (%d)\n", GetLastError());
return GetLastError();
}

DWORD dwDuration = atoi(argv[1]);
LARGE_INTEGER liDueTime = -10000 * dwDuration;
// waitable timer due time is in 100 nano second units
// negative values indicate relative time
if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
{
printf("SetWaitableTimer failed (%d)\n", GetLastError());
return GetLastError();
}

DWORD dwKeepGoing = TRUE;
// enter the "to do" loop while waiting for the timer...
While (dwKeepGoing)
{
switch (WaitForSingleObject(hTimer,0)
{
case WAIT_OBJECT_0:
// duration over,
// optionally finalize "to do" stuff here
// and end child
dwKeepGoing = FALSE;

case WAIT_TIMEOUT:
// do stuff here
break;

case WAIT_FAILED:
// the wait function has failed
printf("WaitForSingleObject failed (%d)\n", GetLastError());
return GetLastError();
}
}
return 0;
}
1

Другие решения

Никто не будет убивать процесс за вас, если вы не сделаете это самостоятельно (например, из родительского процесса) или сам процесс не завершится.

Обратите внимание, что также не существует такой вещи, как «и вернуть управление родительскому приложению». После запуска дочернего процесса и родительский, и дочерний процессы имеют свой собственный «элемент управления» и запускаются одновременно, занимая процессорное время, выделяемое процессам операционной системой.

В общем, вы решаете, кто прекратит процесс. Если вы делаете это из родительского процесса, то после запуска вы сохраняете управление и использование дочернего процесса (хотя это не очень хорошая идея) TerminateProcess API по отношению к дочернему процессу.

В противном случае, и это лучше, дочерний процесс сам продолжает следить за временем выполнения и просто завершает работу, когда пришло время сделать это:

main() {
time_to_exit = now() + N;
while(now() < time_to_exit) {
keep_doing_my_stuff();
}
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector