50 lines
904 B
C
50 lines
904 B
C
/* $FreeBSD$ */
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <err.h>
|
|
#include <errno.h>
|
|
|
|
int received;
|
|
|
|
void handler(int sig, siginfo_t *si, void *ctx)
|
|
{
|
|
if (si->si_code != SI_QUEUE)
|
|
errx(1, "si_code != SI_QUEUE");
|
|
if (si->si_value.sival_int != received)
|
|
errx(1, "signal is out of order");
|
|
received++;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
struct sigaction sa;
|
|
union sigval val;
|
|
int ret;
|
|
int i;
|
|
sigset_t set;
|
|
|
|
sa.sa_flags = SA_SIGINFO;
|
|
sigemptyset(&sa.sa_mask);
|
|
sa.sa_sigaction = handler;
|
|
sigaction(SIGRTMIN, &sa, NULL);
|
|
sigemptyset(&set);
|
|
sigaddset(&set, SIGRTMIN);
|
|
sigprocmask(SIG_BLOCK, &set, NULL);
|
|
i = 0;
|
|
for (;;) {
|
|
val.sival_int = i;
|
|
ret = sigqueue(getpid(), SIGRTMIN, val);
|
|
if (ret == -1) {
|
|
if (errno != EAGAIN) {
|
|
errx(1, "errno != EAGAIN");
|
|
}
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
sigprocmask(SIG_UNBLOCK, &set, NULL);
|
|
if (received != i)
|
|
errx(1, "error, signal lost");
|
|
printf("OK\n");
|
|
}
|