[英]Problem sending signals to child processes
我有一個服務器,它在啟動時使用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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.