У меня есть сервер, который при запуске устанавливает консольный обработчик с функцией 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
, полученный от родительского процесса