Skip to the content.

signal

内核基本实现

task_struct 中的信号字段可分为两类:

| 字段 | 共享/私有 | 作用 | |——————————|——————————————|—————————————————–| | struct signal_struct signal | 指向 thread group 共享的 signal_struct | 包含 shared_pending、进程组信息、资源限制、统计等 | | struct sighand_struct __rcu sighand | 指向共享的 sighand_struct | 包含信号 handler 表 action[]、保护锁 siglock | | sigset_t blocked | 每个线程私有 | 当前被屏蔽(mask)的信号集合 | | ` sigset_t real_blocked | 每个线程私有 | 额外的临时屏蔽,通常用于 sigsuspend | | saved_sigmask | 每个线程私有 | set_restore_sigmask() 保存的旧 mask | | struct sigpending pending` | 每个线程私有 | 本线程独有的 pending 信号队列 |

关键结论:

struct signal_struct {
    // ...
    struct sigpending shared_pending;   // 线程组共享 pending
    struct list_head thread_head;       // 线程组链表
    pid_t pgrp;                         // process group ID
    pid_t session;                      // session ID
    struct rlimit rlim[RLIM_NLIMITS];   // 资源限制
    // cputimer, stats, coredump 状态等
};

重点:

sighand_struct :

struct sighand_struct {
    spinlock_t      siglock;            // 信号子系统核心自旋锁
    refcount_t      count;              // 引用计数
    wait_queue_head_t signalfd_wqh;     // signalfd 等待队列
    struct k_sigaction action[_NSIG];   // 每个信号的 handler 配置
};

注意,信号和 fpu 也是有关系的

arch/x86/kernel/fpu/signal.c

3. 标准信号与实时信号

3.1 标准信号(standard signals)

3.2 实时信号(real-time signals)

TODO

别人其实已经仔细研究过 signal 对于多线程的问题的

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。