| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <signal.h> |
| |
| static sig_atomic_t counter = 0; |
| |
| static void sig_handler(int signum) |
| { |
| static char msg[] = "Signal handler\n"; |
| |
| (void)signum; |
| |
| write(1, msg, sizeof msg - 1); |
| counter++; |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| struct sigaction act, oact; |
| pid_t f; |
| |
| (void)argc; |
| |
| memset(&act, 0x00, sizeof(struct sigaction)); |
| act.sa_handler = sig_handler; |
| sigemptyset(&act.sa_mask); |
| act.sa_flags = SA_RESTART; |
| |
| /* oact is there for the benefit of strace() */ |
| sigaction(SIGINT, &act, &oact); |
| sigaction(SIGTERM, &act, &oact); |
| |
| f = fork(); |
| |
| if ( f < 0 ) { |
| perror(argv[0]); |
| exit(255); |
| } else if ( f > 0 ) { |
| sleep(5); |
| if ( !counter ) { |
| fprintf(stderr, "No signal received!\n"); |
| exit(1); |
| } |
| exit(0); |
| } else { |
| sleep(1); |
| kill(getppid(), SIGINT); |
| exit(0); |
| } |
| } |