rt_sigqueueinfo(2) - Linux 手册页

名称

rt_sigqueueinfo, rt_tgsigqueueinfo - 队列化一个信号和数据

概要

int rt_sigqueueinfo(pid_t tgid, int sig, siginfo_t *uinfo);
int rt_tgsigqueueinfo(pid_t tgid, pid_t tid, int sig,
    siginfo_t *uinfo);
注意:这些系统调用没有 glibc 封装;请参阅 NOTES。

描述

rt_sigqueueinfo() 和 rt_tgsigqueueinfo() 系统调用是用于向进程或线程发送信号以及数据的底层接口。信号的接收者可以通过建立带有 sigaction(2) SA_SIGINFO 标志的信号处理程序来获取伴随的数据。

这些系统调用不适用于直接的应用程序使用;它们被提供是为了允许实现 sigqueue(3)pthread_sigqueue(3)

rt_sigqueueinfo() 系统调用将信号 sig 发送到具有 ID tgid 的线程组。(“线程组”一词与“进程”同义,并且 tid 对应于传统的 UNIX 进程 ID。)该信号将被传递到线程组中的一个任意成员(即,一个当前未阻塞该信号的线程)。

uinfo 参数指定与信号一起发送的数据。此参数是指向类型为 siginfo_t 的结构的指针,该结构在 sigaction(2) 中描述(并通过包含 <sigaction.h> 定义)。调用者应在此结构中设置以下字段

si_code
这必须是 Linux 内核源代码文件 include/asm-generic/siginfo.h 中的一个 SI_* 代码,限制是该代码必须为负数(即,不能是 SI_USER,内核使用它来指示由 kill(2) 发送的信号)并且不能(从 Linux 2.6.39 开始)是 SI_TKILL(内核使用它来指示使用 tgkill(2) 发送的信号)。
si_pid
应将其设置为进程 ID,通常是发送者的进程 ID。
si_uid
应将其设置为用户 ID,通常是发送者的实际用户 ID。
si_value
此字段包含与信号一起发送的用户数据。有关更多信息,请参阅 sigqueue(3) 的最后一个参数(union sigval)的描述。

在内部,内核将 si_signo 字段设置为 sig 中指定的值,以便信号的接收者也可以通过该字段获取信号编号。

rt_tgsigqueueinfo() 系统调用类似于 rt_sigqueueinfo(),但将信号和数据发送到由 tgid(线程组 ID)和 tid(该线程组中的线程)组合指定的单个线程。

返回值

成功时,这些系统调用返回 0。发生错误时,它们返回 -1,并且 errno 被设置为指示错误。

错误

EAGAIN
已达到可以排队的信号限制。(有关更多信息,请参阅 signal(7)。)
EINVAL
sigtgidtid 无效。
EPERM
调用者没有权限向目标发送信号。有关所需的权限,请参阅 kill(2)。或者:uinfo->si_code 无效。
ESRCH
rt_sigqueueinfo(): 没有找到匹配 tgid 的线程组。
rt_tgsigqueinfo(): 没有找到匹配 tgidtid 的线程。

版本

rt_sigqueueinfo() 系统调用是在 Linux 2.2 版本中添加的。rt_tgsigqueueinfo() 系统调用是在 Linux 2.6.31 版本中添加的。

符合

这些系统调用是 Linux 特有的。

说明

由于这些系统调用不适用于应用程序使用,因此没有 glibc 包装函数;如果您想直接调用它们,请使用 syscall(2)

kill(2) 一样,空信号 (0) 可用于检查指定的进程或线程是否存在。

参见

kill(2), sigaction(2), sigprocmask(2), tgkill(2), pthread_sigqueue(3), sigqueue(3), signal(7)