#include #include #include #include #include #include #include #include sem_t sem; #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) static void handler(int sig) { puts("sig handler\n"); // write(STDOUT_FILENO, "sem_post() from handler\n", 24); // if (sem_post(&sem) == -1) // { // write(STDERR_FILENO, "sem_post() failed\n", 18); // _exit(EXIT_FAILURE); // } } int main(int argc, char *argv[]) { struct sigaction sa; struct timespec ts; int s; if (sem_init(&sem, 0, 0) == -1) handle_error("sem_init"); /* Establish SIGALRM handler; set alarm timer using argv[1] */ sa.sa_handler = handler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGINT, &sa, NULL) == -1) handle_error("sigaction"); /* Calculate relative interval as current time plus number of seconds given argv[2] */ if (clock_gettime(CLOCK_REALTIME, &ts) == -1) handle_error("clock_gettime"); ts.tv_sec += atoi(argv[2]); printf("main() about to call sem_wait()\n"); while ((s = sem_wait(&sem)) == -1 ) printf("%d , %d\n", errno, errno == EINTR); }