You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux实时信号SIGRTMIN+n含义及SIGRTMIN+13使用方法咨询

实时信号SIGRTMIN+n系列说明

基础定义

SIGRTMIN是Linux系统实时信号区间的起始编号,该值不是固定常量,会根据CPU架构、C库实现差异变动,常规x86平台的glibc环境下SIGRTMIN值为34,前32个信号为POSIX标准定义的非实时信号(如SIGKILL、SIGUSR1等)。
所有SIGRTMIN + n格式的信号都属于用户自定义可用的实时信号区间,区间上限为SIGRTMAX,常规glibc环境下区间范围是34~64。

SIGRTMIN+n信号的通用规则

  • 系统没有为这类信号预定义统一语义,所有用途完全由用户态程序自行约定,不存在官方统一的SIGRTMIN+13标准含义,你可以根据业务需求自由指定该信号的作用
  • 实时信号和非实时信号的核心差异为支持排队,同一编号的实时信号多次发送时不会丢失,会按发送顺序递送给目标进程;非实时信号不支持排队,同一时间多个同编号的非实时信号处于pending状态时只会触发一次
  • 注意glibc默认会占用SIGRTMIN到SIGRTMIN+2的3个信号用于NPTL线程库的内部实现,建议自定义实时信号从SIGRTMIN+3开始使用,避免和C库内部逻辑冲突

调用kill发送SIGRTMIN+13终止进程的运行逻辑

实时信号的默认处理动作是终止进程,如果你没有为目标进程的SIGRTMIN+13注册自定义处理函数、也没有屏蔽该信号,发送该信号的运行逻辑如下:

  1. 内核首先校验发送方的信号发送权限,确认发送方有权限向目标进程发信号(同UID的普通进程可互发信号,root用户可向所有进程发信号)
  2. 权限校验通过后,内核将该信号添加到目标进程的pending信号队列:如果队列未超出上限则成功排队,队列已满的话kill调用会返回EAGAIN错误
  3. 目标进程被调度执行时,会优先处理pending队列中的实时信号(实时信号优先级高于所有非实时信号,同类型实时信号编号越高优先级越高)
  4. 触发默认处理逻辑时,内核会直接终止目标进程,是否生成core dump取决于目标进程的core dump配置,逻辑和其他默认终止类信号完全一致
  5. 如果目标进程为SIGRTMIN+13注册了自定义信号处理函数,内核会先切换到用户态执行你定义的处理逻辑,处理完成后再回到进程的正常执行流,你也可以在处理函数中自行实现进程终止的逻辑

你给出的示例代码中如果要替换为自定义实时信号通知父进程,可以直接修改kill调用的信号编号参数即可:

/* The child process executes this function. */
void
child_function (void)
{
  /* Perform initialization. */
  printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());

  /* Let parent know you’re done. */
  kill (getppid (), SIGRTMIN + 13);

  /* Continue with execution. */
  puts ("Bye, now....");
  exit (0);
}

内容的提问来源于stack exchange,提问作者drifter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 19:45:05