Chinaunix首页 | 黑桃棋牌官方网下载 | 博客
  • 博客访问: 696116
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1475
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
  • 个人简介

    90后空巢老码农

    文章分类

    全部博文(115)

  • redis(52)
  • vim(1)
  • 正则表达式(1)
  • 分布式(1)
  • Linux环境编程(2)
  • 让你丫爬(1)
  • STL(7)
  • 数学(10)
  • shell脚本(1)
  • Linux驱动(1)
  • 网络(6)
  • 数据结构-算法(14)
  • Linux/UNIX系统编(18)
  • 未分配的博文(0)
  • 文章存档

    2020年(12)

    2019年(54)

    2018年(47)

    2017年(1)

    我的朋友

    分类: LINUX

    2020-03-22 22:32:30

    信号是事件发生时对进程的通知机制,也称为软中断。发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下:
    1. 硬件异常
    2. 用户键入了能够产生信号的终端特殊字符
    3. 发生了软件事件(定时器到期、终端窗口调整等)

    针对每个信号,都定义了一个唯一的整数,从1开始顺序展开。以SIGXXX形式的符号名对这些整数做了定义。

    信号分为两大类。第一类用于内核向进程通知事件,宫城所谓的传统或者标准信号。linux中标准信号的编号范围是1~31,另一类信号由实时信号构成。
    信号到达后,进程可以有如下三种反应:
    1. 采取默认行为
    2. 忽略信号
    3. 指向信号处理器程序
    改变信号处置函数:

    点击(此处)折叠或打开

    1. #include <signal.h>
    2. void (* signal(int sig, void (*handler)(int)) )(int);
    在为signal()指定handler参数时,可以使用如下值来代替函数地址:SIG_DFL或者SIG_IGN

    点击(此处)折叠或打开

    1. #include <signal.h>
    2. int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);
    3. /*returns 0 on success, or -1 on error*/
    4. struct sigaction{
    5.     void (*sa_handler)(int);/*Address of handler,可以为SIG_IGN或者SIG_DFL*/
    6.     sigset_t sa_mask;/*signals blocked during handler invocation, 引发对处理器程序调用的信号将自动添加到进程信号掩码中*/
    7.     int sa_flags;/*flags controlling handler invocation */
    8.     void (*sa_restorer)(void);/*not for application use*/
    9. };
    信号集相关操作如下:

    点击(此处)折叠或打开

    1. #include <signal.h>
    2. int sigemptyset(sigset_t *set);
    3. int sigfillset(sigset_t *set);
    4. /*both return 0 on success, or -1 on error*/
    5. int sigaddset(sigset_t *set, int sig);
    6. int sigdelset(sigset_t *set, int sig);
    7. /*both return 0 on success, or -1 on error*/
    8. int sigismember(const sigset_t *set, int sig);
    9. /*returns 1 if sig is a member of set, otherwise 0*/
    信号掩码:
    内核会为每个进程维护一个信号掩码,即一组信号,并将阻塞其针对该进程的传递。如果将阻塞的信号发送给某个进程,那么对该信号的传递将延后,直至从进程信号掩码中移除该信号,从而解出阻塞位置(信号掩码实际属于线程属性,在多线程进程中,每个线程都可以使用pthread_sigmask()函数来独立检查和修改自身信号掩码)


    点击(此处)折叠或打开

    1. #include <signal.h>
    2. int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
    3. /*returns 0 on success, or -1 on error*/
    上述函数既可以修改进程的信号掩码,又可以获取现有掩码,或者两者兼具
    how取值
    描述
    SIG_BLOCK
    将set指向的信号集合内的信号添加到信号掩码中,与当前掩码集取并
    SIG_UNBLOCK
    将set指向的信号机和内的信号在信号掩码中删除
    SIG_SETMASK
    将set指向的信号机赋值给信号掩码
    上述各种情况,若oldset不为空,则其指向一个sigset_t结构缓冲区,用于返回之前的信号掩码
    如果想获取信号掩码而又对其不做改动,那么可以将set参数指定为空,这时将忽略how参数

    点击(此处)折叠或打开

    1. #include <signal.h>
    2. int sigpending(sigset_t *set);
    3. /*returns 0 on success, or -1 on error*/
    阅读(900) | 评论(0) | 转发(1) |
    0

    上一篇:Linux当中监控文件事件

    下一篇:没有了

    给主人留下些什么吧!~~
    评论热议
    请登录后评论。

    登录 注册