(P16)信号:中断、信号、signal

文章目录

(P16)信号:中断、信号、signal_第1张图片
中断就是打断当前的任务
异步事件:与时间无关,随机发生的事件
中断源产生中断信号——>信号到来时,CPU判断中断是否是屏蔽的——>若没屏蔽,则保护现场——>从中断控制器找到找到对应的中断信号,调用中断处理程序——>恢复现场
中断处理程序保存在中断向量表中,中断向量表保存固定个数的中断处理程序的入口地址
(P16)信号:中断、信号、signal_第2张图片
系统调用就是通过软中断的方式来实现的,x86平台的软中断指令是:INT,arm的软中断指令是SWI
(P16)信号:中断、信号、signal_第3张图片
信号:与中断相似
进程随机的收到异步产生的信号,就像是CPU随机的收到异步产生的中断一样
(P16)信号:中断、信号、signal_第4张图片
(P16)信号:中断、信号、signal_第5张图片
kill -l
man 7 signal
(P16)信号:中断、信号、signal_第6张图片
(P16)信号:中断、信号、signal_第7张图片

信号处理程序
(P16)信号:中断、信号、signal_第8张图片
中断号码
中断处理程序
(P16)信号:中断、信号、signal_第9张图片

P16signal.c

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 


#define ERR_EXIT(m) \
    do \
    { \
        perror(m);
        exit(EXIT_FAILURE);
    } while(0)
void handle(int sig);
int main(int argc, char *argv[])
{
    //SIGINT对应键盘ctrl c
    //signal注册安装一个信号
    if (signal(SIGINT, handle) == SIG_ERR)
        ERR_EXIT("signal error");
    for(;;);
    return 0;
}

void handle(int sig)
{
    printf("recv a sig=%d\n", sig);
}

按下ctrl c,产生了2号SIGINT信号,该信号是异步(随机)产生的;
按下ctrl \,会产生3号SIGQUIT信号
(P16)信号:中断、信号、signal_第10张图片

P16signal2.c

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 


#define ERR_EXIT(m) \
    do \
    { \
        perror(m);
        exit(EXIT_FAILURE);
    } while(0)

void handler(int sig);
int main(int argc, char *argv[])
{
    _sighandler_t oldhandler;
    oldhandler = signal(SIGINT, handler);
    if (oldhandler == SIG_ERR)
        ERR_EXIT("signal error");
    
    while (getchar() != '\n')//循环接收一个字符
        ;
    
    //按下空格后,重新关联成了默认的处理程序
    //等价于信号的默认操作,signal(SIGINT, SIG_FFL),将其重新关联成信号的默认操作
    if (signal(SIGINT, oldhandler) == SIG_ERR)
        ERR_EXIT("signal error");
    for(;;);
    return 0;
}

void handler(int sig)
{
    printf("recv a sig=%d\n", sig);
}

按下空格后,重新关联成了默认的处理程序,再按下ctrl c,会将当前进程终止掉
(P16)信号:中断、信号、signal_第11张图片

(P16)信号:中断、信号、signal_第12张图片

你可能感兴趣的:(Linux高性能编程)