static int do_test (void) { if (signal (SIGUSR1, sigusr1_handler) == SIG_ERR) FAIL_EXIT1 ("signal (SIGUSR1): %m\n"); sigset_t sigs; sigemptyset (&sigs); sigaddset (&sigs, SIGUSR2); if (sigprocmask (SIG_BLOCK, &sigs, NULL) != 0) FAIL_EXIT1 ("sigprocmask (SIGBLOCK, SIGUSR2): %m"); pid_t pid = signal_sender (); int signo = 0; int ret = sigwait (&sigs, &signo); if (ret != 0) { support_record_failure (); errno = ret; printf ("error: sigwait failed: %m (%d)\n", ret); } TEST_VERIFY (signo == SIGUSR2); int status; xwaitpid (pid, &status, 0); TEST_VERIFY (status == 0); return 0; }
static int do_test (void) { struct sigaction action = { .sa_handler = sigusr1_handler, }; sigemptyset (&action.sa_mask); if (sigaction (SIGUSR1, &action, NULL) != 0) { printf ("error: sigaction: %m"); return 1; } action.sa_handler = liveness_signal_handler; if (sigaction (SIGUSR2, &action, NULL) != 0) { printf ("error: sigaction: %m"); return 1; } pid_t sigusr2_sender_pid = fork (); if (sigusr2_sender_pid == 0) signal_sender (SIGUSR2, true); sigusr1_sender_pid = fork (); if (sigusr1_sender_pid == 0) signal_sender (SIGUSR1, false); void *objects[malloc_objects] = {}; unsigned signals = 0; unsigned seed = 1; time_t last_report = 0; while (signals < signal_count) { progress_indicator = 1; int slot = rand_r (&seed) % malloc_objects; size_t size = rand_r (&seed) % malloc_maximum_size; if (kill (sigusr1_sender_pid, SIGCONT) != 0) { printf ("error: kill (SIGCONT): %m\n"); signal (SIGUSR1, SIG_IGN); kill (sigusr1_sender_pid, SIGKILL); kill (sigusr2_sender_pid, SIGKILL); return 1; } sigusr1_received = false; free (objects[slot]); objects[slot] = malloc (size); if (sigusr1_received) { ++signals; time_t current = time (0); if (current != last_report) { printf ("info: SIGUSR1 signal count: %u\n", signals); last_report = current; } } if (objects[slot] == NULL) { printf ("error: malloc: %m\n"); signal (SIGUSR1, SIG_IGN); kill (sigusr1_sender_pid, SIGKILL); kill (sigusr2_sender_pid, SIGKILL); return 1; } } /* Clean up allocations. */ for (int slot = 0; slot < malloc_objects; ++slot) free (objects[slot]); /* Terminate the signal-sending subprocess. The SIGUSR1 handler should no longer run because it uses sigusr1_sender_pid. */ signal (SIGUSR1, SIG_IGN); kill (sigusr1_sender_pid, SIGKILL); kill (sigusr2_sender_pid, SIGKILL); return 0; }