You're looking for sigprocmask.
Code:
#define _POSIX_C_SOURCE 199309L
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NUMCHILDREN 4
void child_func(int n) {
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, SIGUSR1);
sigprocmask(SIG_SETMASK, &sigset, NULL);
int cnt = 0;
for (;;)
while (sigwaitinfo(&sigset, NULL) > 0)
printf("child %d cnt: %d\n", n, ++cnt);
}
int main(void) {
pid_t child[NUMCHILDREN];
for (int i = 0; i < NUMCHILDREN; i++)
if ((child[i] = fork()) == 0) {
child_func(i);
exit(0);
}
printf("Enter 0 to %d to send USR1 signal to that child;"
" -1 to send KILL to all\n", NUMCHILDREN - 1);
for (int n; scanf("%d", &n) == 1 && n >= 0; )
kill(child[n], SIGUSR1);
for (int i = 0; i < NUMCHILDREN; i++) {
kill(child[i], SIGKILL);
wait(NULL);
}
return 0;
}