Синхронизация между родительскими и дочерними процесами
я пишу программу, в которой родительский и дочерний процессы синхронизируют свои действия с сигналами. Итак, в результате мне нужен повторяющийся цикл:
- Родительский процесс должен отправить сигнал SIGUSR1 группе дочерних процессов.
- После получения сигнала от родителя дочерние процессы должны отправить родительскому сигнал SIGUSR2.
- После получения сигналов от всех дочерних процессов родительский процесс должен заснуть на 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);
}