[ULK11]信号(二):几个信号生成函数

这篇博客详细介绍了Linux内核中三个用于信号生成的函数:specific_send_sig_info()、send_signal()和group_send_sig_info()。这些函数分别用于向进程、进程组发送信号,并将信号插入挂起队列。内容涵盖了函数参数、复杂性分析以及不同情况下的处理逻辑,如信号阻塞、实时信号、唤醒进程等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核中几个用于信号产生的函数:

specific_send_sig_info():向进程发送信号
group_send_sig_info():向进程组发送信号
send_signal(): 将信号插入挂起信号队列


specific_send_sig_info()

向t发送信号sig

参数

  • sig 信号ID
  • info 信号的附加信息
  • t 进程描述符

其中,参数info可能的取值如下:

意义
(siginfo_t)info是指向siginfo_t结构的指针
0信号由用户发送
1信号由内核发送
2信号由内核发送,且信号是:SIGSTOP或SIGKILL

复杂性

  1. t阻塞这个信号

  2. t被跟踪

  3. sig是实时信号

  4. sig已经挂起在t的pending列表上

  5. sig必须插入到t的pending列表上,并且这个过程可能失败

  6. 内核需要通知t有新的挂起信号

  7. TIF_SIGPENDING需要被置位

  8. 进程状态是TASK_INTERRUPTIBLE或TASK_STOPPED的时候,需要唤醒进程

  9. t正在另一个处理器上运行


send_signal()

向指定进程的挂起队列中插入新元素

参数

  • sig 信号ID
  • info 附加信息
  • t 进程描述符
  • signals 挂起信号队列的地址

复杂性

  1. sig是实时信号;

  2. sig是SIGKILL或SIGSTOP,这两个信号不能被阻塞,忽略和捕捉(APUE);

  3. t->user->sigpending大于t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur;

  4. 分配新的sigqueue结构失败;

  5. 为用户簿记资源;

  6. 设置队列位掩码中与信号相关的位;
    将sig插入到t的挂起信号队列以后,顺手阻塞sig,这是普通信号的特征,我可以理解.但是,

    sigaddset(&signals->signal, sig);

    这行代码疑点太多:
    1.signals是什么类型的数据结构?为什么signals->signal会指示一个sigset_t域?signals->signal是挂起信号队列的阻塞信号掩码,如pending.signal和shared_pending.signal;而进程描述符的blocked是做什么用的呢?我知道用处之一是作为do_signal()的oldset参数的替补.
    2.为什么这行代码要在第7步和第10步执行两次?


group_send_sig_info()

向p所在的线程组发送信号sig

参数

  • sig
  • info
  • p 进程描述符的地址

复杂性

  1. sig是一个错误的值
    这个函数可由用户进程调用或接受来自用户进程的参数

  2. 用户进程越权发出此信号

  3. sig=0

  4. 目标进程可能正被杀死
    为什么正在被杀死的进程要做特殊处理?

  5. sig可能使p线程组中的其他挂起信号无效
    之前的函数为什么不检查这一点?

  6. p忽略sig

  7. sig已有一个挂起的实例

  8. 向共享挂起信号队列中添加sig

  9. 从p中唤醒一个进程处理sig


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值