有时,进程需要向自身发送信号,raise 函数就执行了这一任务。
#include <signal.h>
int raise(int sig);
在单线程程序中,调用raise相当于对kill的如下调用:
kill(getpid(), sig);
支持线程的系统会将raise(sig)实现为:
pthread_kill(pthread_self(), sig)
后面会描述pthread_kill函数,但目前仅需要了解一点就已足够,该实现意味着将信号传递给调用raise的特定线程。相比之下,kill(getpid(), sig)调用会发送一个信号给调用进程,并可将该信号传递给该进程的任一线程。
raise函数起源于C89。C语言标准不包含诸如进程ID之类的操作系统细节,raise函数之所以得以定义,是因为该函数不需要引用进程ID。
当进程使用raise后者kill向自身发送信号时,信号将立即传递(即,在raise返回调用者之前)。
注意,raise出错将返回非0值(不一定为-1)。调用raise唯一可能发生的错误为EINVAL,即sig无效。因此,在任何指定了某一SIGxxxx常量的位置,都未检查该函数的返回状态。
killpg调用相当于对kill的如下调用
kill(-pgrp, sig);
如果指定pgrp的值为0,那么会向调用者所属进程的所有进程发送此信号。SUSv3对此未做规范,但大多数UNIX实现对该情况的处理与Linux相同。