gpt4 book ai didi

c - 向子进程发送信号时出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:34 25 4
gpt4 key购买 nike

我有一个服务器,它在启动时使用 SetConsoleCtrlHandler() 函数设置控制台处理程序,并创建许多子进程。
我的目标是:

  • 服务器收到CTRL+C信号

  • 服务器向所有事件的子进程生成相同的信号同一个

  • 子进程管理信号并正确完成它们的任务执行

这是我的代码:

//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 ( The new process is the root process of a new process group. ),您基本上创建了一个新进程为每个工作进程分组。

然而,然后调用 GenerateConsoleCtrlEvent(0, 0),其中第二个 0 表示 the signal is generated in all processes that share the console of the calling process.似乎是徒劳的。所有工作进程甚至不在与调用进程相同的进程组中。

也许,您应该在创建工作进程时删除 CREATE_NEW_PROCESS_GROUP 标志,或者记住 lpProcessInformation.dwProcessId每个工作进程的值并为每个调用 GenerateConsoleCtrlEvent

关于c - 向子进程发送信号时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54393362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com