Проблема отправки сигналов дочерним процессам - PullRequest
0 голосов
/ 28 января 2019

У меня есть сервер, который при запуске устанавливает консольный обработчик с функцией SetConsoleCtrlHandler() и создает несколько дочерних процессов.
Моя цель такова:

  • сервер получает сигнал CTRL+C

  • сервер генерирует один и тот же сигнал для всех активных дочерних процессов того же group

  • дочернегопроцессы управляют сигналом и корректно завершают его выполнение

Это мой код:

//handler for server.c
BOOL WINAPI CtrlHandler( DWORD fdwCtrlType ) 
{ 

    //CTRL_C_EVENT
    if(fdwCtrlType == CTRL_BREAK_EVENT)
    {
        newConf=1;
        return TRUE;
    }
    else if(fdwCtrlType == CTRL_C_EVENT)
    {
        //send CTRL+C to all process with the same groupId of calling process
        GenerateConsoleCtrlEvent(0,0);//
        return FALSE;     
    }
}

// server.c main
int main(int argc, char *argv[]) {
    ...
    ...
    if(!SetConsoleCtrlHandler(CtrlHandler, TRUE))
    {
        getLastError("SetConsoleCtrlHandler failed");//function written by me
        exit(EXIT_FAILURE);
    }
    ... 
    ...
    //This is how I create child processes (in a for loop)
    STARTUPINFO info;
    GetStartupInfo(&info);
    WSAPROTOCOL_INFO protInfo;
    PROCESS_INFORMATION processInfo;
    if(!CreateProcess("workerProcess.exe",command, NULL, NULL,0,CREATE_NEW_PROCESS_GROUP, NULL, NULL, &info, &processInfo))
    {
        fprintf(stderr, "could not create process.\n");
        return -1;
    }
    ...
    ...
}


//handler for child process(workerProcess.c)
BOOL WINAPI CtrlWorkerHandler( DWORD fdwCtrlType ) 
{ 

    //CTRL_C_EVENT
    if(fdwCtrlType == CTRL_C_EVENT)
    {
        printf("\nCLOSING WORKER\n");
        return FALSE;  
    }
    return TRUE; 
}

//workerProcess.c main
int main(int argc, char *argv[]) {
    ...
    ...
    if(!SetConsoleCtrlHandler(CtrlWorkerHandler, TRUE))
    {
        fprintf(stderr,"setConsoleCtrlHandler failed\n");
        exit(EXIT_FAILURE);
    }
    ...
    ...
}

Сервер правильно обрабатывает сигнал CTRL + C, функцию GenerateConsoleCtrlEventне дает сбоя, поэтому я предполагаю, что он может отправить сигнал всем процессам, которые имеют тот же groupid, что и вызывающий процесс, но, к сожалению, процесс workerProcess.exe, похоже, не обрабатывает сигнал CTRL+C, полученный от родительского процесса

1 Ответ

0 голосов
/ 30 января 2019

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

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

Возможно, вы должны удалить флаг CREATE_NEW_PROCESS_GROUP при создании рабочих процессов или запомнить lpProcessInformation.dwProcessId значение для каждого рабочего процесса и вызов GenerateConsoleCtrlEvent для каждого.

...