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注册自定义处理函数、也没有屏蔽该信号,发送该信号的运行逻辑如下:
- 内核首先校验发送方的信号发送权限,确认发送方有权限向目标进程发信号(同UID的普通进程可互发信号,root用户可向所有进程发信号)
- 权限校验通过后,内核将该信号添加到目标进程的pending信号队列:如果队列未超出上限则成功排队,队列已满的话
kill调用会返回EAGAIN错误 - 目标进程被调度执行时,会优先处理pending队列中的实时信号(实时信号优先级高于所有非实时信号,同类型实时信号编号越高优先级越高)
- 触发默认处理逻辑时,内核会直接终止目标进程,是否生成core dump取决于目标进程的core dump配置,逻辑和其他默认终止类信号完全一致
- 如果目标进程为
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
相关产品推荐
相关产品推荐

