aboutsummaryrefslogtreecommitdiff
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.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/tools/regression/sigqueue/sigqtest1/sigqtest1.c b/tools/regression/sigqueue/sigqtest1/sigqtest1.c
new file mode 100644
index 000000000000..074f140f11c8
--- /dev/null
+++ b/tools/regression/sigqueue/sigqtest1/sigqtest1.c
@@ -0,0 +1,51 @@
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <unistd.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");
+}