New file |
| | |
| | | #include <unistd.h> |
| | | #include <stdio.h> |
| | | #include <stdlib.h> |
| | | #include <semaphore.h> |
| | | #include <time.h> |
| | | #include <assert.h> |
| | | #include <errno.h> |
| | | #include <signal.h> |
| | | |
| | | 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); |
| | | |
| | | |
| | | |
| | | } |