int main(int argc, char **argv) { int i, nloop, signo; pid_t childpid, parentpid; sigset_t newmask; if (argc != 2) err_quit("usage: lat_sigwait <#loops>"); nloop = atoi(argv[1]); Sigemptyset(&newmask); Sigaddset(&newmask, SIGUSR1); Sigprocmask(SIG_BLOCK, &newmask, NULL); /* block SIGUSR1 */ parentpid = getpid(); if ( (childpid = Fork()) == 0) { for (i = 0; i < nloop; i++) { /* child */ Sigwait(&newmask, &signo); Kill(parentpid, SIGUSR1); } exit(0); } /* 4parent */ Start_time(); for (i = 0; i < nloop; i++) { Kill(childpid, SIGUSR1); Sigwait(&newmask, &signo); } printf("latency: %.3f usec\n", Stop_time() / nloop); exit(0); }
void *SigThread(void *v) { int sig, n; for (;;) { Sigwait(&sigmask, &sig); if (sig == SIGINT) { for (n = 0; n < num_producers; ++n) Pthread_cancel(producers[n]); pthread_exit(NULL); } } }
int main(int argc, char **argv) { int signo; mqd_t mqd; void *buff; ssize_t n; sigset_t newmask; struct mq_attr attr; struct sigevent sigev; if (argc != 2) err_quit("usage: mqnotifysig4 <name>"); /* 4open queue, get attributes, allocate read buffer */ mqd = Mq_open(argv[1], O_RDONLY | O_NONBLOCK); Mq_getattr(mqd, &attr); buff = Malloc(attr.mq_msgsize); Sigemptyset(&newmask); Sigaddset(&newmask, SIGUSR1); Sigprocmask(SIG_BLOCK, &newmask, NULL); /* block SIGUSR1 */ /* 4establish signal handler, enable notification */ sigev.sigev_notify = SIGEV_SIGNAL; sigev.sigev_signo = SIGUSR1; Mq_notify(mqd, &sigev); for ( ; ; ) { Sigwait(&newmask, &signo); if (signo == SIGUSR1) { Mq_notify(mqd, &sigev); /* reregister first */ while ( (n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) >= 0) { printf("read %ld bytes\n", (long) n); } if (errno != EAGAIN) err_sys("mq_receive error"); } } exit(0); }
int main(int argc, char **argv) { int signo; mqd_t mqd; void *buff; ssize_t n; sigset_t newmask; struct mq_attr attr; struct sigevent sigev; if (argc != 2) err_quit("Usage: mqnotifysig4 <name>"); mqd = Mq_open(argv[1], O_RDONLY | O_NONBLOCK); Mq_getattr(mqd, &attr); buff = (void *)Malloc(attr.mq_msgsize); Sigemptyset(&newmask); Sigaddset(&newmask, SIGUSR1); Sigprocmask(SIG_BLOCK, &newmask, NULL); sigev.sigev_notify = SIGEV_SIGNAL; sigev.sigev_signo = SIGUSR1; Mq_notify(mqd, &sigev); for ( ; ; ) { Sigwait(&newmask, &signo); if (signo == SIGUSR1) { Mq_notify(mqd, &sigev); while ((n = mq_receive(mqd, buff, attr.mq_msgsize, NULL)) >= 0) printf("read %ld bytes\n", (long)n); if (errno != EAGAIN) err_sys("mq_receive error"); } } exit(0); }