【问题标题】:Problem sending signals to child processes向子进程发送信号时出现问题
【发布时间】: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


    【解决方案1】:

    不确定并且现在无法测试,但我试了一下:通过为 每个 工作进程指定 CREATE_NEW_PROCESS_GROUP (The new process is the root process of a new process group.),您基本上可以为每个工作进程创建一个新的进程组.

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2022-06-15
      • 2020-03-25
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多