'display all blocked and pending signals at one time

The following program checks if a signal is pending. I use the sigpending function to return blocked (or waiting) signals. The problem is that I don't want this, I would like to display all the blocked and pending signals at some point, how can I do that? What should I change?

code:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void catcher(int signum) {
    puts("inside catcher!");
    if (signum != 0)
        perror("signum error");
}

void check_pending(int signum, char * signame) {
    sigset_t sigset;

    if (sigpending( & sigset) != 0)
        perror("sigpending() error");
    else if (sigismember( & sigset, signum))
        printf("a %s signal is pending\n", signame);
    else
        printf("no %s signals are pending\n", signame);
}

int main() {
    struct sigaction sigact;
    sigset_t sigset;

    sigemptyset( & sigact.sa_mask);
    sigact.sa_flags = 0;
    sigact.sa_handler = catcher;
    if (sigaction(SIGUSR1, & sigact, NULL) != 0)
        perror("sigaction() error");
    else {
        sigemptyset( & sigset);
        sigaddset( & sigset, SIGUSR1);
        if (sigprocmask(SIG_SETMASK, & sigset, NULL) != 0)
            perror("sigprocmask() error");
        else {
            puts("SIGUSR1 signals are now blocked");
            kill(getpid(), SIGUSR1);
            printf("after kill: ");
            check_pending(SIGUSR1, "SIGUSR1");
            sigemptyset( & sigset);
            sigprocmask(SIG_SETMASK, & sigset, NULL);
            puts("SIGUSR1 signals are no longer blocked");
            check_pending(SIGUSR1, "SIGUSR1");
        }
    }
}


Solution 1:[1]

Use sigignore to dispose the signal. Program below will check pending signals in 1s intervals and display theirs numbers. Terminate with sending SIGTERM.

#define _XOPEN_SOURCE 500

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int i;
    sigset_t sigset;

    printf("my pid is %d\n", getpid());
    sigfillset(&sigset);
    sigprocmask(SIG_SETMASK, &sigset, NULL);
    while (1) {
        sigpending(&sigset);
        for (i = 1; i < 32; ++i) {
            if (sigismember(&sigset, i)) {
                printf("signal %d pending\n", i);
                sigignore(i);
                if (i == SIGTERM) {
                    exit(0);
                }
            }
        }
        sleep(1);
    }
    return 0;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1