1152155Sdavidxu/* $FreeBSD$ */ 2197965Skib#include <err.h> 3197965Skib#include <errno.h> 4152155Sdavidxu#include <signal.h> 5152155Sdavidxu#include <stdio.h> 6197965Skib#include <unistd.h> 7152155Sdavidxu 8152155Sdavidxuint received; 9152155Sdavidxu 10197965Skibvoid 11197965Skibhandler(int sig, siginfo_t *si, void *ctx) 12152155Sdavidxu{ 13152155Sdavidxu if (si->si_code != SI_QUEUE) 14152155Sdavidxu errx(1, "si_code != SI_QUEUE"); 15152155Sdavidxu if (si->si_value.sival_int != received) 16152155Sdavidxu errx(1, "signal is out of order"); 17152155Sdavidxu received++; 18152155Sdavidxu} 19152155Sdavidxu 20197965Skibint 21197965Skibmain() 22152155Sdavidxu{ 23152155Sdavidxu struct sigaction sa; 24152155Sdavidxu union sigval val; 25152155Sdavidxu int ret; 26152155Sdavidxu int i; 27152155Sdavidxu sigset_t set; 28152155Sdavidxu 29152155Sdavidxu sa.sa_flags = SA_SIGINFO; 30152155Sdavidxu sigemptyset(&sa.sa_mask); 31152155Sdavidxu sa.sa_sigaction = handler; 32152155Sdavidxu sigaction(SIGRTMIN, &sa, NULL); 33152155Sdavidxu sigemptyset(&set); 34152155Sdavidxu sigaddset(&set, SIGRTMIN); 35152155Sdavidxu sigprocmask(SIG_BLOCK, &set, NULL); 36152155Sdavidxu i = 0; 37152155Sdavidxu for (;;) { 38152155Sdavidxu val.sival_int = i; 39152155Sdavidxu ret = sigqueue(getpid(), SIGRTMIN, val); 40152155Sdavidxu if (ret == -1) { 41152155Sdavidxu if (errno != EAGAIN) { 42152155Sdavidxu errx(1, "errno != EAGAIN"); 43152155Sdavidxu } 44152155Sdavidxu break; 45152155Sdavidxu } 46152155Sdavidxu i++; 47152155Sdavidxu } 48152155Sdavidxu sigprocmask(SIG_UNBLOCK, &set, NULL); 49152155Sdavidxu if (received != i) 50152155Sdavidxu errx(1, "error, signal lost"); 51152155Sdavidxu printf("OK\n"); 52152155Sdavidxu} 53