'Processes synchronization using signals in c

I`m writing the program in which parent and child processes synchronize their actions with signals. So, as result, I need a repeated cycle:

  1. The parent process should send signal SIGUSR1 to a group of the child processes.
  2. After getting the signal from the parent, the child processes should send signal SIGUSR2 to the parent.
  3. After getting the signals from all child processes, the parent process should sleep for 1 s. But if the parent process gets signal SIGTERM from the child, the parent should send SIGTERM to all child processes and they should stop working.

I`ve already written how to create the group of child processes and send to them signal SIGUSR1. But I don't know how to send signal SIGUSR2 from child processes to the parent process and verify if all child processes sent a signal and if the sent signals contain SIGTERM signal. Please, help me!

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

static volatile sig_atomic_t got_signal;

void sig_child(int signo){
        printf("Signal caught.");
}

void handler(int sig)
{
        printf("caught signal: %d\n", getpid());
        got_signal = 1;
    signal(SIGUSR2, sig_child);
    printf("sent signal: %d\n", getpid());
    kill(getppid(), SIGUSR2);
}

int main() {

        pid_t child;
        pid_t children[3];
        int status;
        int i = 0;

        signal(SIGUSR1, handler);

        for (; i < 3; i++) {
                switch (child = fork()) {
                        case -1:
                                perror("could not create child: ");
                                break;
                        case 0:
                                printf("child: %d\n", getpid());
                                while (!got_signal);
                                _exit(0);
                        default:
                                children[i] = child;
                                /*put all children in process group of eldest child*/
                                setpgid(child, children[0]);
                }
        }

        sleep(1);

        /* send signal to all child by sending signal to process group of eldest child */
        kill(-children[0], SIGUSR1);

    int n = 0;
    while (n < 3) {
            waitpid(children[n], &status, 0);
        n++;
    }
    
        exit(0);
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source