如何在 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
我一直在尝试创建一个自定义系统调用来打印有关进程的各种信息。该信息是挂起的信号。我了解到在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