#include #include #include #include static const int NOF_SIGNALS = 1000; static volatile sig_atomic_t received_signals = 0; static volatile sig_atomic_t terminated = 0; static void count_signals(int sig) { ++received_signals; } void termination_handler(int sig) { terminated = 1; } int main() { sighold(SIGUSR1); sighold(SIGTERM); pid_t child = fork(); if (child < 0) { perror("fork"); exit(1); } if (child == 0) { struct sigaction action = {0}; action.sa_handler = count_signals; if (sigaction(SIGUSR1, &action, 0) != 0) { perror("sigaction"); exit(1); } action.sa_handler = termination_handler; if (sigaction(SIGTERM, &action, 0) != 0) { perror("sigaction"); exit(1); } sigrelse(SIGUSR1); sigrelse(SIGTERM); while (!terminated) pause(); printf("[%d] received %d signals\n", (int) getpid(), received_signals); exit(0); } sigrelse(SIGUSR1); sigrelse(SIGTERM); for (int i = 0; i < NOF_SIGNALS; ++i) { kill(child, SIGUSR1); } printf("[%d] sent %d signals\n", (int) getpid(), NOF_SIGNALS); kill(child, SIGTERM); wait(0); }