diff options
Diffstat (limited to 'tools/regression/sigqueue/sigqtest1')
| -rw-r--r-- | tools/regression/sigqueue/sigqtest1/Makefile | 5 | ||||
| -rw-r--r-- | tools/regression/sigqueue/sigqtest1/sigqtest1.c | 51 | 
2 files changed, 56 insertions, 0 deletions
| diff --git a/tools/regression/sigqueue/sigqtest1/Makefile b/tools/regression/sigqueue/sigqtest1/Makefile new file mode 100644 index 000000000000..9efd0c2eec2a --- /dev/null +++ b/tools/regression/sigqueue/sigqtest1/Makefile @@ -0,0 +1,5 @@ +PROG=sigqtest1 +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 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"); +} | 
