Тема: синхронізація батьківського та дочірніх процесів.
Привіт, я пишу програму, в якій батьківський і дочірній процеси синхронізують свої дії з сигналами.
Отже, в результаті мені потрібен повторний цикл:
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);
}