簡體   English   中英

如何等待子進程發送信號?

[英]How to wait for the children processes to send signals?

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>

void handler(int signumber)
{
    return;
}

int main()
{
    int i, pid;
    int children_count = 5;
    int arr_childprocesses[5];
    int parent_pid = getpid();

    for(i=0;i<children_count;i++)
    {
        pid = fork();
        if(pid == -1) 
        {
            perror("Err");
            exit(EXIT_FAILURE);
        }

        if(pid == 0) break;

        arr_childprocesses[i] = pid;
    }

    if (pid == 0) // children
    {
        kill(parent_pid,SIGUSR1);
        printf("Child(%d) sig sent. Waiting 5s...\n",getpid());
        sleep(5);
        printf("Child(%d) terminated.\n",getpid());
    }
    else // parent
    {
        signal(SIGUSR1,handler);
        for(i=0;i<children_count;++i)
        {
            waitpid(arr_childprocesses[i],NULL,0);
            printf("Parent: Signal received.\n");
        }
        printf("Parent(%d) signals received. Waiting 3s...\n",getpid());
        sleep(3);
        printf("Parent(%d) terminated.\n",getpid());
    }

    exit(EXIT_SUCCESS); 
}

我想等到所有的孩子都給我發信號。 然后與孩子們和父母一起做一些工作。 但程序會停止,直到所有孩子都終止。 我該怎么做?

結果:

在此輸入圖像描述

更新1:包括完整代碼加結果

你可能在這里面對一場比賽。

父級在設置此信號的處理程序之前接收SIGUSR1 由於接收SIGUSR1的默認行為是結束,因此父親死亡。

您希望在分離子項之前在父項內設置信號處理程序。

(如果從程序設計中,對於孩子設置SIGUSR1信號處理程序是不可接受的,只需調用signal(SIGUSR1, SIG_DFL)作為子內部的第一個語句來卸載此處理程序。)

為了證明這個理論,你可能想暫時加一個sleep(1); 在調用kill()之前的孩子里面。


作為完成任務的提示:

看看sigaction()因為它提供了一個更強大的信號接口,然后是函數signal() 特別是讀取SA_SIGINFO標志,因為它允許將siginfo_t類型變量傳遞給信號處理程序。 后一個變量帶有關於誰(由PID識別)發送信號的信息,這是解決方案的關鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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