1 /* $FreeBSD$ */ 2 #include <err.h> 3 #include <errno.h> 4 #include <signal.h> 5 #include <stdio.h> 6 #include <unistd.h> 7 8 int received; 9 10 void 11 handler(int sig, siginfo_t *si, void *ctx) 12 { 13 if (si->si_code != SI_QUEUE) 14 errx(1, "si_code != SI_QUEUE"); 15 if (si->si_value.sival_int != received) 16 errx(1, "signal is out of order"); 17 received++; 18 } 19 20 int 21 main() 22 { 23 struct sigaction sa; 24 union sigval val; 25 int ret; 26 int i; 27 sigset_t set; 28 29 sa.sa_flags = SA_SIGINFO; 30 sigemptyset(&sa.sa_mask); 31 sa.sa_sigaction = handler; 32 sigaction(SIGRTMIN, &sa, NULL); 33 sigemptyset(&set); 34 sigaddset(&set, SIGRTMIN); 35 sigprocmask(SIG_BLOCK, &set, NULL); 36 i = 0; 37 for (;;) { 38 val.sival_int = i; 39 ret = sigqueue(getpid(), SIGRTMIN, val); 40 if (ret == -1) { 41 if (errno != EAGAIN) { 42 errx(1, "errno != EAGAIN"); 43 } 44 break; 45 } 46 i++; 47 } 48 sigprocmask(SIG_UNBLOCK, &set, NULL); 49 if (received != i) 50 errx(1, "error, signal lost"); 51 printf("OK\n"); 52 } 53