首页 > 其他分享 >day04

day04

时间:2023-08-21 20:36:23浏览次数:38  
标签:set 函数 int 信号处理 day04 信号 进程

信号管理 一、基本概念     1、中断         当程序进程接收到消息后,中止当前正在进行的进程,转而去执行其他任务等其他任务执行结束后再返回刚刚中止的位置,可以继续往下运行         中断分为硬件中断、软件中断,硬件中断是由硬件设备引发的、软件中断是执行了中断指令引发     2、         信号是一种软件中断,由操作系统发出,进程接收后会执行相应的操作     3、         常见信号             kill -l 显示所有信号             SIGINT(2)   Ctrl+c      终止             SIGQUIT(3)  Ctrl+\      终止+core             SIGFPE(8)   除0         终止+core             SIGKILL(9)  终止信号     终止             SIGEGV(11)  非法访问内存 终止+core     4、不可靠信号和可靠信号         建立在早期的信号处理机制上的信号被称为不可靠信号(1-31)             不支持排队,可能会丢失,如果同一个信号连续多次发送,可能进程只接收到一两次         建立在新的信号处理机制上的信号称为可靠信号(34-64)             支持排队,不会丢失     5、信号的来源:         硬件异常:除0、非法访问内存、使用未定义的指令、总线错误         软件异常:通过一些命令、函数产生信号     6、信号的处理方式         1、忽略         2、终止进程         3、终止+core    记录终止前情况         4、捕获并处理(*)             在信号来之前,先向内核注册一个信号处理函数与要捕获的信号绑定,当信号发生时进程会中止先转去信号处理函数     7、命令发送信号         kill 信号编号(宏名) 进程id(pid)      
二、信号捕获     typedef void (*sighandler_t)(int);
    sighandler_t  signal(int  signum,  sighandler_t  handler);     功能:向内核注册一个信号处理函数         signum:要绑定捕获的信号编号         handler:函数指针    提供需要注册的信号处理函数             也可以使用以下参数                 SIG_IGN 忽略处理                 SIG_DFL 按默认方式处理     返回值:之前的信号处理方式         注意:只有9、19 号信号不能被捕获、也不能被忽略         注意:有些系统通过signal注册的函数只能有效一次,第一次之后会还原成默认的处理方式,可以在信号处理函数的末尾重新signal注册一次         注意:信号处理函数结束后会返回产生信号产生时的代码出继续执行,如果导致信号产生的错误还在,例如段错误、除零等,可能会导致死循环,反复调用信号处理函数,正确的处理方式是备份进程的数据然后立即结束进程(exit)         注意:通过fork子进程会继承父进程的信号处理方式,但是通过exec系列函数创建的子进程会恢复默认的信号处理方式
三、信号的产生     1、键盘         Ctrl+C  Ctrl+\  Ctrl+z挂起\暂停  fg继续     2、错误         段错误  除0  硬件故障       3、命令         kill -信号id  进程号         killall -信号id  进程名  向同进程名的所有进程发送信号     4、函数         int kill(pid_t pid,int sig);         功能:向进程号为pid的进程发送信号sig         int riase(int sig);         功能:向自己发送信号sig         void abort(void);         功能:向自己发送SIGABRT信号         unsigned int alarm(unsigned int seconds);         功能:让内核在secongs秒后向自己发送SIGALRM信号         返回值:上一次alarm设置的剩余秒数         注意:再次调用alarm函数会重置闹钟时间,不会产生两次信号
四、进程休眠     unsigned int slepp(unsigned int seconds);     功能:让调用进程进入指定的休眠秒数,秒数到了会唤醒,并且在休眠中遇到了正常信号都会提前唤醒返回     返回值:剩余没睡的秒数     int pause(void);     功能:让进程进入休眠,直到遇到正常的信号才唤醒     返回值:要么一直休眠不返回,要么返回-1表示信号来了
五、信号集和信号阻塞     信号集:         是一种数据类型,定义变量可以存储多个信号             sigset_t 是一个128位的二进制数 用每一位代表一个信号         相关函数:             int sigemptyset(sigset_t *set);             功能:清空信号集set             int sigfillset(sigset_t *set);             功能:填满信号集set             int sigaddset(sigset_t *set, int signum);             功能:向信号集set中添加信号signum             int sigdelset(sigset_t *set, int signum);             功能:从信号集set中删除信号signum             int sigismember(const sigset_t *set, int signum);             功能:测试信号集set中是否存在信号signum             返回值:                 1:存在 0:不存在 -1:非法     信号阻塞:         当进程正在执行一些关键型的特殊操作时,不适合暂停去处理信号,此时可以让内核先屏蔽信号,等特殊操作完成后再继续发送并处理         当信号产生时,内核会在其维护的一张信号表中给对应的进程设置一个该信号的标记,整个过程称为‘递送’         从信号产生到完成递送的过程有一个时间间隔,处于该间隔中的信号状态称为‘未决’         信号阻塞屏蔽是让信号处于未决状态,暂停递送,当解除阻塞时信号继续递送处于未决状态的信号就会继续递送         每个进程中都有一个信号集用于记录该进程中要屏蔽的信号
        int sigprocmask(int  how,  const  sigset_t  *set,  sigset_t *oldset);         功能:设置进程的信号屏蔽集             how:  设置信号屏蔽的方式                 SIG_BLOCK       把set中的信号添加到本进程的信号屏蔽集中 (追加)                 SIG_UNBLOCK     从信号屏蔽集中删除set中的信号       (不再屏蔽)                 SIG_SETMASK     用set完全替换原来的信号屏蔽集       (覆盖)             set:想要设置的信号集             oldset:获取设置前信号屏蔽集
六、附带信息的信号处理函数     int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);     功能:向内核注册一个信号处理函数         signum:想要绑定的信号         act:    想要住的的信号处理函数             struct sigaction {                void     (*sa_handler)(int);                             //不带信息的信号处理函数                void     (*sa_sigaction)(int, siginfo_t *, void *);      //附带额外信息的信号处理函数                sigset_t   sa_mask;                                      //信号屏蔽集,如果有想要屏蔽的信号,可以给该成员赋值                int        sa_flags;                                     //信号绑定的处理标志                                 (SA_SIGINFO)  使用sa_sigaction来绑定                                 (SA_NODEFER)  在信号处理过程中绑定的信号不会被屏蔽                                 (SA_RESETHAND) 该信号处理方式执行一次后,会还原回默认的信号处理方式                                 (SA_RESTART)  绑定的信号处理完系统函数后,被中断的系统调用会重新启动                                                void     (*sa_restorer)(void);   //保留NULL            };
    int sigqueue(pid_t pid, int sig, const union sigval value);     功能:向进程pid发送附带额外信息数据的信号sig         union sigval {             int   sival_int;        //整数             void *sival_ptr;        //指针         };
七、定时器     int getitimer(int which, struct itimerval *curr_value);     功能:获取当前进程的定时方案         which:             ITIMER_REAL     真实定时器      程序的总运行时间    SIGALRM             ITIMER_VIRTUAL  虚拟定时器      用户态的运行时间    SIGVTALRM             ITIMER_PROF     实际定时器      用户态+内核态的运行时间     SIGPROF                 真实定时器时间=实际定时器时间+切换时间+休眠时间         curr_value:定时方案             struct itimerval {                struct timeval it_interval; /* 定时器的间隔时间 */                struct timeval it_value;    /* 第一次启动定时器时间 */            };
           struct timeval {                time_t      tv_sec;         /* 秒 */                suseconds_t tv_usec;        /* 微秒 */            };

    int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);     功能:设置定时器         new_value:想要设置的定时方案         old_value:获取旧的定时方案

标签:set,函数,int,信号处理,day04,信号,进程
From: https://www.cnblogs.com/ymy1/p/17647003.html

相关文章

  • JavaSE学习笔记day04
    IO流概念:OS的文件系统:(1)文件:文本文件、视频文件、音频文件、图像文件、可执行文件等等,这些文件都是由一个个字节组成的。(2)目录(文件夹):对文件进行归纳划分,将同类型的文件方法在同一个文件夹中,方便我们管理和使用。(3)资源访问路径:1)相对路径:相对于某一个文件夹......
  • 网络编程day04--线程管理
    线程管理基本概念1、线程是进程的执行路线,它是进程内部的控制序列,线程是进程的一部分,进程是一个资源单位,而线程是执行单位,线程是进程执行的实体,负责真正的执行2、线程是轻量级的,没有自己的代码段、数据段、bss段、堆、环境变量、命令行参数、文件描述符、信号处理函数、当前工......
  • day04 - 链表part02
     24. 两两交换链表中的节点/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,ListNode......
  • 20天 hot 100 速通计划-day04
    普通数组238.除自身以外数组的乘积给你一个整数数组nums,返回数组answer,其中answer[i]等于nums中除nums[i]之外其余各元素的乘积。题目数据保证数组nums之中任意元素的全部前缀元素和后缀的乘积都在32位整数范围内。请不要使用除法,且在O(*n*)时间复杂度内......
  • Linux环境编程day04--信号产生与处理
    信号管理基本概念1、中断当进程接收到消息后中止当前正在进行进程,转而去执行其它任务,等其它任务执行结束后再返回刚刚中止的位置,可以继续往下运行这种执行模式称为中断中断分为硬件中断、软件中断,硬件中断是由硬件设备引发的、软件中断是执行了中断指令引发2、信号信号是一......
  • [代码随想录]Day04-链表part02
    题目:24.两两交换链表中的节点思路:首先给他加一个虚拟头结点,然后思考反转的逻辑,这是每两个为一组,比如1,2是一组、3,4是一组,如果说1,2一组2,3一组就变成了链表的逆转了。那么指针的逻辑是:两个指针一个r指向要交换的二元组的第一个节点一个l指向前一个节点二元组的第二个节......
  • day04课程回顾
    课程回顾数据类型转换按照类型大小排序byteshortint(char)longfloatdoublebyte1字节8位 -2^7~2^7-1short2字节16位 -2^15~2^15-1int4字节 32位 -2^31~2^31-1long 8字节 64位 -2^63~2^61-1float 4字节 32位 -10......
  • 初学C语言day04--数组
    一、数组什么是数组:变量的组合,是一种批量定义相同类型变量的方式    定义:类型名数组名[数量];intarr[5];注意:数组的长度一旦确定,无法改变使用:数组名[下标];下标:从0开始,范围:0~数量-1    遍历:把数组的数据从头到尾显示或访问一般与for循环配合,把循环变量i当做......
  • Java学习day04: 方法和数组
    我在B站上大学......
  • Day04_变量
    1.什么是变量: 2.变量的基本使用: 3.内存管理:垃圾回收机制: 4.变量的三大组成部分和变量名规范: 5.变量名的命名风格: 6.1.变量值的三个重要的特征: 6.2.is与==: 7.小整数池: 8.常量:不变的量: ......