【发布时间】:2019-06-20 22:42:34
【问题描述】:
我有一台服务器,它在启动时使用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 信号
【问题讨论】:
标签: c winapi console signals handler