diff options
author | davidxu <davidxu@FreeBSD.org> | 2005-11-07 14:10:33 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2005-11-07 14:10:33 +0000 |
commit | 18fc4b11b970023df7ac96da6c60462df4f58391 (patch) | |
tree | f992796d09263e5cde6cf33d806219592faab8e3 /tools/regression | |
parent | 02881cfb024c13140f8d62ba581f3c76bb077758 (diff) | |
download | FreeBSD-src-18fc4b11b970023df7ac96da6c60462df4f58391.zip FreeBSD-src-18fc4b11b970023df7ac96da6c60462df4f58391.tar.gz |
Add sigqueue test code.
Diffstat (limited to 'tools/regression')
-rw-r--r-- | tools/regression/sigqueue/Makefile | 5 | ||||
-rw-r--r-- | tools/regression/sigqueue/sigqtest1/Makefile | 8 | ||||
-rw-r--r-- | tools/regression/sigqueue/sigqtest1/sigqtest1.c | 49 |
3 files changed, 62 insertions, 0 deletions
diff --git a/tools/regression/sigqueue/Makefile b/tools/regression/sigqueue/Makefile new file mode 100644 index 0000000..d3046c4 --- /dev/null +++ b/tools/regression/sigqueue/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +SUBDIR=sigqtest1 + +.include <bsd.subdir.mk> diff --git a/tools/regression/sigqueue/sigqtest1/Makefile b/tools/regression/sigqueue/sigqtest1/Makefile new file mode 100644 index 0000000..08a140c --- /dev/null +++ b/tools/regression/sigqueue/sigqtest1/Makefile @@ -0,0 +1,8 @@ +# $FreeBSD$ + +PROG=sigqtest1 +LDADD+= +NO_MAN= +DEBUG_FLAGS=-g + +.include <bsd.prog.mk> 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"); +} |