Linux:简单信号编程记录

重要信号相关函数

信号发送函数

  • kill
    可打断sleep函数,处理信号函数之后直接执行不再睡眠
  • killpg
    给进程组发信号,killpg(pid,sign)等价于kill(-pid,sign);
  • raise
    给自己发信号,等价于kill(getpid(),sign);
  • sigqueue
    给进程发信号,支持排队可附带信息

其他信号相关函数

  • pause
    进程挂起,直到捕获到信号
  • alarm
    延迟一定时间后,发送SIGALRM信号

部分函数说明及补充

  • int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
    用于改变进程接收到特定信号后的行为
  • int sigqueue(pid_t pid,int sig,const union sigval value);
    在队列中向指定进程发送一个信号和数据(与kill函数相似),与函数sigaction()配合使用

可重入与不可重入函数

  • 满足以下条件的函数基本为不可重入函数
    • 使用静态数据结构
    • 使用malloc函数或者free函数
    • 使用I/O函数

信号掩码

  • 说明
    • 每个进程都有一个信号掩码(signal mask),也称为信号屏蔽字;
    • 信号掩码规定了当前要屏蔽或要阻塞递送到该进程的信号集;
    • 对于每种可能的信号,该掩码中都有一位与之对应;
    • 对于某种信号,若其对应位(bit)已设置,则它当前是被阻塞的;
    • 信号对应位为1,就表示在执行当前信号集的处理程序期间相应的信号暂时被“屏蔽”或“阻塞”,使得在执行的过程中不会嵌套地响应那个信号。

信号集

  • 数据类型为sigset_t

    • int sigemptyset(sigset_t *set);
      初始化信号集为empty
    • int sigfillset(sigset_t *set);
      把所有信号加入到集合中并初始化
    • int sigaddset(sigset_t *set,int signum);
      将信号signum加入到set信号集
    • int sigdelset(sigset_t *set,int signum);
      将信号signum从信号集中删除
    • int sigismember(const sigset_t *set,int signum);
      查询signum是否在信号集
    • int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);
      用于改变进程的当前阻塞信号集,也可以用来检测当前进程的信号掩码。

  • sigprocmask

    函数说明

    • sigprocmask 可以用来检测或改变信号屏蔽字,其操作依参数how来决定
    • 如果参数oldset是一个非空指针,信号屏蔽字会由此指针返回
    • 如果set是一个非空指针,参数how指示如何修改当前信号屏蔽字
    • 每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。

    参数说明

    • how:
      • SIG_BLOCK
        newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。
      • SIG_UNBLOCK
        将参数newset所指向的信号集中的信号从当前的信号掩码中移除。
      • SIG_SETMASK
        设置当前信号掩码为参数newset所指向的信号集中所包含的信号。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值