• 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相同。

  • 相关阅读:
    链表操作
    51nod1085-----01背包
    51nod1046快速幂取余
    51nod贪心算法入门-----任务分配问题
    51nod动态规划-----矩阵取数
    51nod贪心算法入门-----独木舟问题
    POJ2255二叉树
    POJ1182并查集
    POJ1384完全背包问题
    20162313_苑洪铭_ 第7周学习总结
  • 原文地址:https://www.cnblogs.com/tuhooo/p/8678084.html
Copyright © 2020-2023  润新知