如何在 UNIX 中使用 SYSCALL 打印所有未决信号?

How to print all pending signals using a SYSCALL in UNIX?

我一直在尝试创建一个自定义系统调用来打印有关进程的各种信息。该信息是挂起的信号。我了解到在task_struct下还有一个struct叫做sigpending,定义如下:

struct sigpending {
                 struct list_head list;
                 sigset_t signal;   };

所以我最初尝试使用 list_for_each_entry,但这需要知道存储挂起信号的结构中成员的名称,我似乎找不到。

那么我该如何打印它们呢?

一个想法是检查 [pending] sigset_t 位并将信号打印为数字、字符串或混合。 轻松适应内核版本,此示例显示为工作用户代码:

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

// partial list for printing as strings:
static char *sigstrs[_NSIG] = {
    [SIGHUP] = "HUP",
    [SIGSEGV] = "SEGV",
};

static void show_pending(char *str, sigset_t *ssetp)
{
    int signo;

    printf(str);
    for (signo = 1; signo < _NSIG; signo++) {
        if (sigismember(ssetp, signo) == 0)
            continue;
        else if (sigstrs[signo])
            printf(" SIG%s", sigstrs[signo]);
        else
            printf(" %d", signo);
    }
    printf("\n");
}

int main(void)
{
    // user simulation, &taskp->pending.signal;
    sigset_t pending;
    memset(&pending, 0, sizeof (pending));
    sigaddset(&pending, SIGHUP);
    sigaddset(&pending, SIGSEGV);

    show_pending("pending:", &pending);
    return (0);
}

输出:
pending: SIGHUP SIGSEGV