Linux siginfo结构体深度解析
linux struct siginfo

首页 2024-12-03 04:16:32



Linux中的struct siginfo:深入理解信号机制的核心结构 在Linux操作系统中,信号(signal)是一种重要的进程间通信机制,它允许一个进程通知另一个进程某个事件的发生

    信号机制不仅用于处理诸如用户按下CTRL+C等外部事件,还用于内核通知进程系统内部的事件,如非法内存访问、定时器到期等

    在Linux的信号处理中,`struct siginfo`结构扮演着至关重要的角色,它提供了关于信号的详细信息,使得信号处理函数能够获取更多的上下文信息,从而作出更精确的处理决策

     siginfo_t结构的定义与功能 `siginfo_t`是Linux内核中定义的一个数据结构,用于在信号传递过程中携带附加信息

    这个结构体的定义可能因系统不同而略有差异,但通常包含以下几个关键字段: - `int si_signo`:信号的编号,即传递给进程的信号类型

     - `int si_errno`:如果非零,表示与该信号相关联的错误号

     - `int si_code`:信号的来源或类型码,用于区分信号的不同来源或原因

     `siginfo_t`结构的核心在于其包含一个联合体(union)`_sifields`,这个联合体包含了多个可能的结构体,每个结构体对应不同类型的信号,并提供了关于该信号的详细信息

    例如: - `_kill`结构体用于`SIGKILL`、`SIGINT`等由用户或进程发送的信号,包含了发送进程的PID和UID

     - `_timer`结构体用于由定时器到期发送的信号,包含了定时器的ID、过期次数和信号值

     - `_sigchld`结构体用于`SIGCHLD`信号,当子进程状态发生变化时发送给父进程,包含了子进程的PID、UID、退出状态等信息

     - `_sigfault`结构体用于`SIGSEGV`、`SIGBUS`等由非法内存访问引起的信号,包含了导致错误的内存地址

     这种设计使得`siginfo_t`结构能够灵活地适应不同类型的信号,并为信号处理函数提供丰富的上下文信息

     信号处理函数与sigaction 在Linux中,信号处理函数是通过`sigaction`函数设置的

    `sigaction`函数允许进程为特定的信号指定一个处理函数,并控制信号处理过程中的一些行为

    `sigaction`函数的参数包括信号编号、指向`structsigaction`结构的指针以及一个可选的用于保存旧处理函数的指针

     `structsigaction`结构包含以下几个关键字段: - `_u`联合体:包含了信号处理函数指针`_sa_handler`或`_sa_sigaction`

    其中,`_sa_handler`是一个只接受信号编号作为参数的函数指针,适用于传统信号;`_sa_sigaction`则是一个接受信号编号、`siginfo_t`指针和上下文指针的三参数函数指针,适用于实时信号

     - `sigset_t sa_mask`:指定在信号处理函数执行期间应被阻塞的信号集

     - `unsigned longsa_flags`:包含多个标志位,用于控制信号处理的行为

    其中,`SA_SIGINFO`标志位尤为重要,它指示信号处理函数将接收`siginfo_t`结构作为参数

     当设置了`SA_SIGINFO`标志位时,信