Unix系统编程()发送信号的其他方式:raise和killpg

Posted tuhooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unix系统编程()发送信号的其他方式:raise和killpg相关的知识,希望对你有一定的参考价值。

有时,进程需要向自身发送信号,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相同。

以上是关于Unix系统编程()发送信号的其他方式:raise和killpg的主要内容,如果未能解决你的问题,请参考以下文章

Unix环境高级编程信号

[linux basic]基础--信号

UNIX环境高级编程第十章上

信号的发送kill,raise,alarm,setitimer,abort,sigqueue

Linux串口编程(中断方式和select方式)

Unix系统编程 信号部分学习笔记