簡體   English   中英

向子進程發送信號的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM