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:第一次时钟信号产生的时间

原文地址:https://www.cnblogs.com/goul/p/9368317.html