summaryrefslogtreecommitdiffstats
path: root/tools/regression/sigqueue/sigqtest1/sigqtest1.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/regression/sigqueue/sigqtest1/sigqtest1.c')
-rw-r--r--tools/regression/sigqueue/sigqtest1/sigqtest1.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/tools/regression/sigqueue/sigqtest1/sigqtest1.c b/tools/regression/sigqueue/sigqtest1/sigqtest1.c
new file mode 100644
index 0000000..0f40021
--- /dev/null
+++ b/tools/regression/sigqueue/sigqtest1/sigqtest1.c
@@ -0,0 +1,49 @@
+/* $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");
+}
OpenPOWER on IntegriCloud