zoukankan      html  css  js  c++  java
  • [学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践

    1基本概念

    中断

    q  中断是系统对于异步事件的响应

    q  中断信号

    q  中断源

    q  现场信息

    q  中断处理程序

    q  中断向量表

    异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序

    生活中的中断和计算机系统中的中断

    1)  无中断生活场景

    张三看书,厨房烧水

    2)有中断的生活场景

    张三看书,设置闹钟,厨房烧水。

    闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读。

    3)计算机系统的中断场景

    中断源发出中断信号,CPU判断中断是否屏蔽屏蔽、保护现场 ,cpu执行中断处理程序, cpu恢复现场,继续原来的任务。
    4)中断的其他概念

    中断向量表保存了中断处理程序的入口地址。

    中断个数固定,操作系统启动时初始化中断向量表。

    中断有优先级(有人敲门,有人打电话,有优先级)

    中断可以屏蔽(张三可以屏蔽电话)。

    中断分类

    q  硬件中断(外部中断)

             外部中断是指由外部设备通过硬件请求的方式产生的中断,也称为硬件中断

    q  软件中断(内部中断)

             内部中断是由CPU运行程序错误或执行内部程序调用引起的一种中断,也称为软件中断。

    q  x86平台INT指令 ARM软中断指令SWI

    信号概念

    q  信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。

    q  信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等

    q  信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断

    信号和中断的区别

    q  信号与中断的相似点:

    q  (1)采用了相同的异步通信方式;

    q  (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

    q  (3)都在处理完毕后返回到原来的断点;

    q  (4)对信号或中断都可进行屏蔽。

    q  信号与中断的区别:

    q  (1)中断有优先级,而信号没有优先级,所有的信号都是平等的;

    q  (2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

    q  (3)中断响应是及时的,而信号响应通常都有较大的时间延迟。

    2信号名称及常用信号

    信号名称         描述

    SIGABRT  进程停止运行 6

    SIGALRM 警告钟

    SIGFPE      算述运算例外

    SIGHUP    系统挂断

    SIGILL       非法指令

    SIGINT      终端中断  2

    SIGKILL     停止进程(此信号不能被忽略或捕获)

    SIGPIPE    向没有读者的管道写入数据

    SIGSEGV  无效内存段访问

    SIGQUIT   终端退出   3

    SIGTERM 终止

    SIGUSR1  用户定义信号1

    SIGUSR2  用户定义信号2

    SIGCHLD  子进程已经停止或退出 

    SIGCONT 如果被停止则继续执行

    SIGSTOP   停止执行

    SIGTSTP   终端停止信号

    SIGTOUT  后台进程请求进行写操作

    SIGTTIN   后台进程请求进行读操作

    实验1:

    kill –l    可以查看linux内核支持的信号

    Man 7 signal 查看信号的默认动作、信号的含义

    3信号处理

    进程对信号的三种相应

    q  忽略信号 

             不采取任何操作、有两个信号不能被忽略:SIGKILL(9号信号)和SIGSTOP。

    思考1:为什么进程不能忽略SIGKILL、SIGSTOP信号。(如果应用程序可以忽略这2个信号,系统管理无法杀死、暂停进程,无法对系统进行管理。)。SIGKILL(9号信号)和SIGSTOP信号是不能被捕获的。

    q  捕获并处理信号  

             内核中断正在执行的代码,转去执行先前注册过的处理程序。

    q  执行默认操作  

             默认操作通常是终止进程,这取决于被发送的信号。

    信号的默认操作:通过 man 7 signal 进程查看

    man 7 signal

    编程实践:让应用程序捕捉ctrl+c信号

    以ctrl+c 会产生一个中断。当前应用程序捕捉ctrl+c中断信号。

    4信号signal函数编程实践

    signal信号安装函数

    signal函数,作用1:站在应用程序的角度,注册一个信号处理函数。

               作用2:忽略信号、设置信号默认处理  信号的安装和恢复

    q  typedef void (*__sighandler_t) (int);

    q  #define SIG_ERR ((__sighandler_t) -1)

    q  #define SIG_DFL ((__sighandler_t) 0)

    q  #define SIG_IGN ((__sighandler_t) 1)

    q  函数原型:

             __sighandler_t signal(int signum, __sighandler_t handler);

    参数

    q  signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出

    q  handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void

    q  handler也可以是下面两个特殊值:

                                  SIG_IGN     屏蔽该信号

                                  SIG_DFL     恢复默认行为

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include <unistd.h>
    #include<errno.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <signal.h>
    
    /*
           typedef void (*sighandler_t)(int);
    
           sighandler_t    signal(int    signum,
           sighandler_t handler);
    
    */
    
    int g_tag = 1;
    
    __sighandler_t old;
    // Linux内核调用这个函数
    
    void myhandle(int num)
    {
        printf("recv signal id num : %d
    ", num);
        if (3 == num)
        {
            g_tag = 0;
       // signal(SIGINT, SIG_DFL); 
       // signal(SIGINT, old); }
    return; } int main(void) { // 信号的安装 old = signal(SIGINT, myhandle) if ( signal(SIGINT, myhandle) == SIG_ERR ) { perror("signal err"); return 0; } if ( signal(SIGQUIT, myhandle) == SIG_ERR ) { perror("signal err"); return 0; } /* 无效的参数 if ( signal(SIGKILL, myhandle) == SIG_ERR ) { perror("signal err"); return 0; } */ while(g_tag); return 0; }
  • 相关阅读:
    Map 嵌套存储Map
    LinkedList;以及迭代器Iterator
    计算某字符串中大写字母、小写字母以及数字的个数
    String字符串转多种类型及多种方法的应用
    String类的构造方法
    String类(附件)
    (五)Kubernetes集群安装
    (四)Kubernetes 网络通讯方式
    (三)Kubernetes-Pod概念
    (二)Kubernetes组件说明
  • 原文地址:https://www.cnblogs.com/shichuan/p/4432620.html
Copyright © 2011-2022 走看看