How to wait for the children processes to send signals?

痴心易碎 提交于 2019-12-08 08:59:24

问题


#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); 
}

I want to wait until all the children send me a signal. Then do some work with the children and with the parent too. But the program stops until all the children terminate. How should I do this?

Result:

Update 1: full code plus result included


回答1:


You are probably facing a race here.

The parent receives the SIGUSR1 before its handler for this signal had been set up. As the default behaviour on receiving a SIGUSR1 is to end, the parent dies.

You want to setup the signal handler inside the parent before forking off the child.

(If from the programs design it is unacceptbale for the child to have SIGUSR1 signal handler set up, just call signal(SIGUSR1, SIG_DFL) as the 1st statement inside the child to deinstall this handler.)

To prove this theory you might like to temporarily add a sleep(1); inside the child just before the call to kill().


As a hint to fulfill your assignment:

Have a look at sigaction() as it provides a much more powerful interface to signalling then the function signal() does. Especially read about the SA_SIGINFO flag as it enables passing a siginfo_t typed variable to your signal handler. This latter variable carries info on who (identified by PID) sent the signal, which is the key to your solution.



来源:https://stackoverflow.com/questions/30014553/how-to-wait-for-the-children-processes-to-send-signals

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!