2016-12-29 14 views
-2

У меня есть программа, которая иногда падает. В таком случае моя программа должна перезагрузиться. Но, убивая его через Диспетчер задач, он должен закончиться.
Я создал программу мониторинга, которая контролирует фактическую программу и перезапускает ее при сбое.
Я выполняю эту работу, используя сигналы, которые отправляют фактическую программу для ее завершения.
Я использую ОС Windows.
То есть мне нужно, чтобы перехватить сигнал, посланный к фактической программе в моей программе монитораКонтролировать программу и перезапускать ее при сбое

+3

Почему бы не исправить вашу программу, чтобы она не разбилась? – PaulMcKenzie

+1

В чем вопрос? Почему вы не исправляете свою программу? –

+0

Моя программа редко срабатывает, как тайм-аут, поэтому перезапуск снова заставляет ее работать нормально. Поэтому в этом случае моя программа мониторинга должна перезапустить ее. – Priya

ответ

1

Монитор процесс должен сделать следующее:

  1. Создание основного процесса, и тем самым получить дескриптор, который обработать.
  2. Подождите, пока этот сигнал не будет сигнализирован, например, с WaitForSingleObject, что указывает на то, что процесс завершен.
  3. Перезапустите процесс, получить новый дескриптор процесса, а затем перейти к этапу 2.

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

Если возможно, вы должны исправить свою программу, чтобы она не разбилась.

+0

Но я должен был закончить программу, не прерывая программу «monitor». – Priya

+0

Ну, как бы программа монитора знала, что это было намеренное прекращение? Если вы действительно хотите убедиться, что ваш процесс всегда запущен, то процедура, которую я описываю, - это путь. Возможно, вам нужно немного подумать о том, чего вы пытаетесь достичь. Мне кажется, что вы уже приняли решение о своем решении (которое не работает) и не хотят ничего развлекать. В этом случае удачи! –

0

, конечно, вам нужно исправить свое приложение, так как оно не разбилось. только это хорошее решение. однако формально вы можете сделать следующее (плохо)

void Ep() 
{ 
    // tag by * in begin of CommandLine 
    PWSTR CommandLine = GetCommandLine(); 

    if (!CommandLine || *CommandLine != '*') 
    { 
     // monitor case 

     WCHAR FileName[MAX_PATH]; 
     if (ULONG n = GetModuleFileName(0, FileName, RTL_NUMBER_OF(FileName))) 
     { 
      if (n < MAX_PATH) 
      { 
       PROCESS_INFORMATION pi; 
       STARTUPINFO si = { sizeof(si) }; 
       PWSTR newCommandLine = (PWSTR)alloca((wcslen(CommandLine) + 2)*sizeof(WCHAR)); 
       *newCommandLine = '*'; 
       wcscpy(newCommandLine + 1, CommandLine); 

       // monitor and restart self in loop 
       BOOL bRestart; 
       do 
       { 
        bRestart = FALSE; 
        if (CreateProcessW(FileName, newCommandLine, 0, 0, 0, 0, 0, 0, &si, &pi)) 
        { 
         CloseHandle(pi.hThread); 
         WaitForSingleObject(pi.hProcess, INFINITE); 
         ULONG exitcode; 
         bRestart = GetExitCodeProcess(pi.hProcess, &exitcode); 
         CloseHandle(pi.hProcess); 
         if (bRestart) 
         { 
          // 0xff - terminated by WerFault 
          // (int)exitcode < 0 - exception in process 
          bRestart = exitcode == 0xff || ((int)exitcode < 0); 
         } 
        } 
       } while (bRestart); 
      } 
     } 
     ExitProcess(0); 
    } 
    else 
    { 
     // main case 

     wcscpy(CommandLine, CommandLine + 1); 

     if (MessageBoxW(0, L"make crash ?", CommandLine, MB_YESNO) == IDYES) 
     { 
      __debugbreak();// simulate crash 
     } 
     ExitProcess(0); 
    } 
} 
1

Давайте проигнорируем ваш вопрос на мгновение и рассмотрим проблему вместо этого. Вы ищете способ перезапустить приложение при ненормальном выходе, но при этом сохраняете возможность прекратить выполнение приложения (через его графический интерфейс или диспетчер задач).

Windows предлагает Application Recovery and Restart для этого. Это встроенная в систему инфраструктура, которая позволяет зарегистрировать приложение для перезапуска в случае необработанного исключения (неофициально называется авария).