/* * signal-test-syscall-correct.c */ #include #include #include #include #include #include #include #include void handler(int signum); int main(int argc, char *argv[]) { char buf[10]; struct sigaction sa; /* set up the struct that defines what to do on receipt of a signal */ memset(&sa, '\0', sizeof(sa)); sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; /* associate that action with a particular signal */ if(sigaction(SIGUSR1, &sa, NULL) < 0) { perror("sigaction"); exit(1); } /* be helpful */ printf("My pid is %d\n", getpid()); write(1, "waiting for a signal\n", 21); while(1) { if(read(0, buf, 10) < 0) { /* if we were interrupted by a signal, try again */ if(errno == EINTR) { continue; /* otherwise bail entirely */ } else { perror("read"); exit(1); } } printf("read(2) returned successfully\n"); break; } } void handler(int signum) { printf("received signal %d\n", signum); }