Fix sigqueue test

This commit is contained in:
Ron Williams
2025-02-07 22:04:01 +00:00
committed by Jeremy Soller
parent da174f9626
commit 6ea993bf46
2 changed files with 41 additions and 16 deletions
+1 -1
View File
@@ -179,7 +179,6 @@ NAMES=\
sa_restart \
sigchld \
stdio/ctermid \
sigqueue \
stdio/tempnam \
stdio/tmpnam \
stdlib/bsearch \
@@ -216,6 +215,7 @@ NAMES=\
grp/gr_iter \
# resource/getrusage
# time/times
# sigqueue
# Tests run with `expect` (require a .c file and an .exp file
# that takes the produced binary as the first argument)
+40 -15
View File
@@ -1,4 +1,5 @@
#include <assert.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <pthread.h>
@@ -14,7 +15,8 @@ volatile sig_atomic_t num = 0;
int parent;
void validate(int sig, const siginfo_t *info) {
void validate(int sig, const siginfo_t *info)
{
assert(sig == THE_SIG);
assert(info != NULL);
assert(info->si_signo == THE_SIG);
@@ -23,15 +25,16 @@ void validate(int sig, const siginfo_t *info) {
assert(info->si_pid == parent);
}
void action(int sig, siginfo_t *info, void *context) {
void action(int sig, siginfo_t *info, void *context)
{
(void)context;
assert(context != NULL);
validate(sig, info);
write(1, "action\n", 7);
num++;
}
int main(void) {
int main(void)
{
int status, fds[2];
status = pipe(fds);
@@ -72,17 +75,18 @@ int main(void) {
ERROR_IF(close, status, == -1);
struct sigaction sa;
memcpy(&sa.sa_mask, &set, sizeof (sigset_t));
memcpy(&sa.sa_mask, &set, sizeof(sigset_t));
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = action;
status = sigaction(THE_SIG, &sa, NULL);
ERROR_IF(sigaction, status, == -1);
if (child == 0) {
if (child == 0)
{
assert(num == 0);
siginfo_t info;
struct timespec t = (struct timespec){ .tv_sec = 1, .tv_nsec = 0 };
struct timespec t = (struct timespec){.tv_sec = 1, .tv_nsec = 200000000};
status = sigtimedwait(&set, &info, &t);
ERROR_IF(sigtimedwait, status, == -1);
validate(THE_SIG, &info);
@@ -92,9 +96,9 @@ int main(void) {
// TODO: check status
status = sigsuspend(&empty_set);
if (status == -1) {
perror("error in sigsuspend");
puts("[EINTR] is usually expected");
if (status == -1)
{
UNEXP_IF(sigsuspend, errno, != EINTR);
}
assert(num == 2); // ensure signal handler ran
@@ -102,19 +106,40 @@ int main(void) {
status = sigprocmask(SIG_SETMASK, &empty_set, NULL);
ERROR_IF(sigprocmask, status, == -1);
while (num < 31) {}
while (num < 31)
{
}
status = write(fds[1], "A", 1);
ERROR_IF(write, status, == -1);
} else {
for (int n = 0; n <= 31; n++) {
status = sigqueue(child, THE_SIG, (union sigval){ .sival_int = n });
}
else
{
struct timespec t = (struct timespec){.tv_sec = 0, .tv_nsec = 100000000};
status = nanosleep(&t, NULL);
ERROR_IF(nanosleep, status, < 0);
for (int n = 0; n <= 31; n++)
{
status = sigqueue(child, THE_SIG, (union sigval){.sival_int = n});
ERROR_IF(sigqueue, status, == -1);
}
char buf[1];
status = read(fds[0], buf, 1);
ERROR_IF(read, status, == -1);
pid_t wait_pid = 0;
int wait_status = 0;
wait_pid = wait(&wait_status);
ERROR_IF(wait, wait_pid, < 0);
UNEXP_IF(wait, wait_pid, != child);
if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != EXIT_SUCCESS)
{
fprintf(stderr, "Unexpected result, WIFEXITED %s, WEXITSTATUS %d\n",
WIFEXITED(wait_status) ? "true" : "false", WEXITSTATUS(wait_status));
return EXIT_FAILURE;
}
}
return 0;
return EXIT_SUCCESS;
}