c - 向子进程发送信号时出现问题
问题描述
我有一台服务器,它在启动时使用该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
从父进程接收到的信号
解决方案
不确定并且现在无法测试,但我试了一下:通过为每个工作进程指定CREATE_NEW_PROCESS_GROUP
(新进程是新进程组的根进程。)你基本上为每个工作进程创建一个新进程组。
但是,然后调用GenerateConsoleCtrlEvent(0, 0)
,其中第二个0
表示信号是在共享调用进程控制台的所有进程中生成的。似乎是徒劳的。所有工作进程甚至都不在与调用进程相同的进程组中。
CREATE_NEW_PROCESS_GROUP
可能,您应该在创建工作进程时删除该标志,或者记住每个工作进程的lpProcessInformation.dwProcessId
值并为每个工作进程调用GenerateConsoleCtrlEvent
。
推荐阅读
- reactjs - 为什么打开 ./build/index.html 会显示空白页?
- sql - DB2:递归查询
- graphql - GraphQL:当父级为空时,响应中没有可用的子级/嵌套数据?
- go - 使用elasticsearch原子操作更新
- sql - 如何正确编写此查询?
- reactjs - 错误:找不到样式目标。它开始出现在带有 React 实现的 SSR 之后。怎么修?
- python - 如何确定可执行文件是否从活动 shell 中启动?
- applescript - (AppleScript)是否可以编写一个对话框,每次看到它时都会显示一个随机字符串?
- javascript - 上传的图片没有返回到 PHP
- android - 除了android中的活动之外,还有什么是调用网络类的好方法?