• UNIX环境C


    一.信号的概念

      信号就是一种软中断,进程与进程之间信号的传递,都是通过内核来当做中转站的,不能直接传递信号。

    二、信号的分类(128位信号,不过可用信号就1~64除去32与33)

      1.不可靠信号(SIGHUP(1)~SIGSYS(31)):由于他是非实时信号,所以他会产生多次信号,但不支持排队,并且只接受一次,因此信号有可能丢失,所以是不可靠信号。

      2.可靠信号(SIGRGMI(34)~SIGRTMAX(64)):由于他是实时信号,如果他产生多次信号,他会进行排队,信号会被全盘接受,信号不会丢失,所以是可靠信号。

    三、信号的捕获与处理

       1.signal函数会注册一个信号处理函数,需要在程序开始时初始化,如果程序接受到信号时,这个函数就会启用。

       2.用fork函数创建的子进程会继承父进程的信号处理方式,当vfork和exec组成而创建的子进程不会继承父进程的信号处理方式。

    四、信号的发送

      1.终端发送:kill  -sig  pid                  2.函数调用:int   kill(pid_t pid,int sig)

      3.有关时间的信号

        a.睡眠(pause):没有时间的限制,只有收到不可忽略的信号时,才会结束此函数,如果有信号处理函数,先执行信号处理函数,再返回-1

        b.睡眠(sleep):可手动控制时间的函数,若收到信号,则返回剩余的秒数,如没收到信号,则等时间过完,返回0

        c.时钟(alarm):闹钟一般需要与pause函数结合使用,当度过所设定的时间是,会返回一个SIGALRM信号,默认处理直接退出。

         

       

    五、信号屏蔽

      1.信号集

        a.信号集的创建

          1)创建信号集  sigset_t*  set

          2)  填满信号集  sigfillset(sigset_t*  set)

          3)清空信号集  sigemptyset(sigset_t*  set)

          4)向信号集中添加信号   sigaddset(sigset_t*  set,int  signal)

          5)向信号集中删除信号 sigdelset(sigset_t*  set,int siganl)

          6)  测试信号集中的信号    sigismember(const   sigset_t*  set,int signal)

         2.屏蔽信号(signal mask)

        每一个进程都有一个屏蔽掩码 , 里面包含了进程的屏蔽信号。

        信号的屏蔽不是选择不接受信号,而是延时接受信号。

             延时接受:设置屏蔽掩码的目的是为了防止程序在进程一些敏感操作时,被打断。当处理完敏感操作后,就会接受信号。可靠信号会排队接受,不可靠信号只接受一次。

        int signprocmask(int how,const sigset_t *set,sigset_t * oldset)

                      功能:设置进程的信号掩码(信号屏蔽码)

                         how:修改信号掩码的方式

                                SIG_BLOCK:向信号掩码中添加信号

                                SIG_UNBLOCK:从信号掩码中删除信号

                                SIG_SETMASK:用新的信号集替换旧的信号掩码

                        newset:新添加、删除、替换的信号集,也可以为空

                        oldset:获取旧的信号掩码

                int  sigpending(sigset_t *set)

              功能:获取未决状态的信号    

    六、计时器

          操作系统维护了三个计时器

              真实计时器:程序的运行时间

              虚拟计时器:记录程序在用户态耗费的时间

              实用计时器:记录程序在用户态和内核态耗费的时间和

              真实  =  实用  +  进出的耗费  +  休眠。

              int getitimer(int which, struct itimerval *curr_value);

             功能:获取之间设置的定时任务

             which:计时器的类型

                      ITIMER_REAL :真实时间,信号是:SIGALRM

                      ITIMER_VIRTUAL:虚拟,信号:SIGVTALEM

                      ITIMER_PROF :实用,信号:SIGPROF

             curr_value:

                       it_interval:时钟信号的间隔时间

                       it_value:第一次时钟信号产生的时间

  • 相关阅读:
    2.17NOIP模拟赛(by hzwer) T2 小奇的序列
    2.17NOIP模拟赛(by hzwer) T1 小奇挖矿
    题解【洛谷P3662】[USACO17FEB]Why Did the Cow Cross the Road II S
    题解【CF886B】Vlad and Cafes
    题解【CJOJ1070/UVA】嵌套矩形
    题解 【CF381A】 Sereja and Dima
    何时使用UI层的智能表单技术
    开机加电到系统打开究竟发生了什么?(1)
    asp.net MVC 常见安全问题及解决方案
    HDU 4422 The Little Girl who Picks Mushrooms【水题】
  • 原文地址:https://www.cnblogs.com/goul/p/9368317.html
Copyright © 2020-2023  润新知