UNIX编程----信号(代码,以及详细内容逐步更新)

  1. 信号的类型
    • 标准信号(1~31)
    • 实时信号(34~64)
  2. 查看所有信号
    • kill -l
    • man 7 signal
  3. 信号的默认行为
    • Term(终止执行)
    • Core(终止执行并产生coredump)
    • Ign(忽略)
    • Stop(停止运行)
    • Cont(继续运行)
  4. 信号的行为注册
    • signal(2)
      • 默认处理(SIG_DFL):信号由该特定信号的默认动作处理。
        忽略信号(SIG_IGN):忽略信号,即使没有意义,代码执行仍将继续。
        函数处理程序:定义一个特定的函数来处理信号。
        void handler_function (int parameter);parameter就是信号序号
      • SIGKILL和SIGTOP不能改变
  5. 产生信号
    • Ctrl+c —>SIGINT Ctrl+\ —>SIGQUIT Ctrl+z —>SIGSTOP
    • kill(2) / alarm(2)将信号发给进程或进程组
      int kill(pid_t pid, int sig);
      参数:
      pid:可能选择有以下四种
      pid大于零时,pid是信号欲送往的进程的标识。
      pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。
      pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。pid小于-1时,信号将送往以-pid为组标识的进程。
      alarm()
      功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程
    • 程序出错—》段错误
  6. 信号特点
    • 丢失—》显示信号结构是位图
    • 打断阻塞的系统调用
    • 响应过程是嵌套的
    • 忽略信号的本质mask=1
    • 信号处理函数中不能用longjmp跳转—》信号处理函数调用结束将mask置0
    • 信号处理函数使用可重入函数
    • 无法阻止信号的到来,只能选择不去响应(本人自行添加的)
      不可重入函数
      (a)使用静态数据结构
      (b)他们调用malloc和free
      ©他们是标准I/O函数
  7. 信号集
    • sigset_t
    • sigemptyset(2)//手册第二章
    • sigaddset(2)
    • sigdelset(2)
    • sigfillset(2)
      上面四个函数成功的返回值为1,若出错返回值为-1.
    • sigismember(2)
      若真则返回1,若假则返回0,若出错返回-1
sigset_t set;
sigempty(&set);//初始化信号集,清除其中所有信号
sigfillset(&set)//初始化信号集,使其包括所有信号。
//所有程序在使用信号集前都要调用sigempty()或者sigfillset()函数进行一次初始化。
sigaddset(&set,SIGINT)//将SIGINT信号添加到信号集中
sigdelset(&set,SIGINT)//将SIGINT信号删除信号集
sigismember(&set,SIGINT)//判断SIGINT信号是否在信号集set里
  1. 设置信号屏蔽字(mask位图)
    • sigprocmask(2)
      sigprocmask(int how,const sigset_t *restrict set,sigset_t *restrict oset);
      oset当前信号屏蔽字由它返回)
how说明
SIG_BLOCK该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我们希望阻塞的附加信号
SIG_UNBLOCK该进程新的信号屏蔽字是当前信号屏蔽字和set所指向信号集补集的交集。set包含了我们希望解除阻塞的信号
SIG_SETMASK该进程新的信号屏蔽字将被set指向的信号集的值代替
sigset_t set,oset//请按上面步骤自行初始化
sigprocmask(SIG_BLOCK, &set, &oldset);
  • sigsuspend(2)—>信号驱动程序运行(收到信号程序运行)
    • sigprocmask(SIG_SERMASK, &set, &oldset)
    • pause(2)
    • sigprocmask(SIG_SETMASK, &oldset, NULL)
  1. sigaction(2)!!!
//代码原型
int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);
struct sigaction {
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
 - sa_handler	
   - SIG_DFL
   - SIG_IGN
   - 函数
 - sa_flags
   - SA_SIGINFO--->sa_sigaction信号处理函数
   - SA_NOCHLDWAIT 子进程终止后不是僵尸进程
 - sa_mask
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
static void hander(int s)
{
	write(1,"*",1);
}

int main(void)
{
	struct sigaction act,oact;
	act.sa_handler = hander;
	sigemptyset(&act.sa_mask);\\信号集

	sigaddset(&act.sa_mask, SIGINT);
	sigprocmask(SIG_BLOCK, &act.sa_mask, &oact.sa_mask);
	act.sa_flags = 0;
	sigaction(SIGINT,&act,&oact);
	while(1)
		;
	
	exit(0);
}
  1. setitimer(2)
    ITIMER_REAL : 以系统真实的时间来计算,它送出SIGALRM信号。  
    ITIMER_VIRTUAL : -以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。  
    ITIMER_PROF : 以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。
    第二个参数指定间隔时间,第三个参数用来返回上一次定时器的间隔时间,如果不关心该值可设为NULL。
    • TIMER_REAL—>SIGALRM
    • 指定时间间隔产生信号
    • 最小时间单位微秒
  2. 流量控制
    • 漏桶
    • 令牌桶

本文主要参考UNIX环境高级编程第二版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值