操作系统:信号

目录

1、信号

2、信号产生

3、信号状态

4、信号处理

5、pcb中的信号集

6、查看信号表

7、信号四要素

8、signal 函数

9、sigaction 函数


1、信号

       A发送给B信号,B收到信号后,必须暂停运行,先处理信号,处理完再回来继续执行。类似中断,称为“软中断”。信号简单、不能携带大量信息。所有信号都是由内核负责发送的,也是由内核负责处理的。

2、信号产生

(1)按键产生:Ctrl+c、Ctrl+z、Ctrl+\

(2)命令产生:kill命令

(3)系统调用产生:kill、about、raise

(4)软件条件产生:定时器sleep()、alarm

(5)硬件异常产生:非法内存访问(段错误)、除0、内存对齐出错(总线错误)

3、信号状态

(1)未决:信号刚产生后,没有到达进程;或者由于阻塞(屏蔽),导致信号不能到达进程,一直处于未决。

(2)递达:发送并且到达进程。

4、信号处理

(1)执行默认动作

(2)忽略(丢弃)

(3)捕捉(调用用户处理函数)

5、pcb中的信号集

(1)未决信号集:位于进程pcb,一旦某信号产生,对应标志位立即翻转为1,当信号送达进程,立即翻转为0。

(2)阻塞信号集(信号屏蔽字):当信号对应的阻塞信号集标志位为1时,信号一直处于未决状态。

6、查看信号表

kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

       1 - 33   常规信号,都有默认动作

       34 - 64 实时信号,没有默认动作,一般作为底层硬件驱动

7、信号四要素

       编号、名称、事件、默认动作

       查看帮助文档

man 7 signal

8、signal 函数

        signal 不会阻塞,只起到了注册待捕捉信号行为的作用。

#include <signal.h>

typedef void (*sighandler_t)(int);       // 回调函数

sighandler_t signal(int signum, sighandler_t handler);  // 信号 + 回调

/*
    The signals SIGKILL and SIGSTOP cannot be caught or ignored.

    signal(signum, SIG_IGN);   // 当信号到来时,忽略信号,什么也不做

    signal(signum, SIG_DFL);   // 当信号到来时,执行默认的操作

    signal(signum, myhandler);  // 当信号到来时,执行用户自己定义的操作
*/

9、sigaction 函数

#include <signal.h>

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;                    // mask 的信号不能打断当前正在信号正在执行的处理
    int        sa_flags;                   // 0 表示当前执行不被其他信号打断
    void     (*sa_restorer)(void);
};


/*
    signum specifies the signal and can be any valid signal except SIGKILL and SIGSTOP
*/

void myhandler(int signum){
    //xxx
}

struct sigaction act, oldact;
act.sa_handler = myhandler;
act.sa_mask = 0;
act.sa_flags = 0;

sigaction(signum, &act, &oldact);

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值