Синхронизация между родительскими и дочерними процесами

я пишу программу, в которой родительский и дочерний процессы синхронизируют свои действия с сигналами. Итак, в результате мне нужен повторяющийся цикл:

  1. Родительский процесс должен отправить сигнал SIGUSR1 группе дочерних процессов.
  2. После получения сигнала от родителя дочерние процессы должны отправить родительскому сигнал SIGUSR2.
  3. После получения сигналов от всех дочерних процессов родительский процесс должен заснуть на 1 с. Но если родительский процесс получает сигнал SIGTERM от дочернего, родитель должен отправить SIGTERM всем дочерним процессам, и они должны перестать работать.

Я уже написал, как создать группу дочерних процессов и послать им сигнал SIGUSR1. Но я не знаю, как отправить сигнал SIGUSR2 из дочерних процессов в родительский процесс и проверить, все ли дочерние процессы отправили сигнал и содержат ли отправленные сигналы сигнал SIGTERM. Помогите пожалуйста мне!

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

Ответы (0 шт):