#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);
|
|
|
|
}
|