zoukankan      html  css  js  c++  java
  • Linux c 信号—pause、sigsuspend 的相同于区别

    pause函数:

         功能:让进程暂停直到信号出现

        #include<unistd.h>

         intpause();

         函数说明:pause()会令目前的进程暂停(进入睡眠状态),直至信号(signal)所中断。

         返回值:只返回-1

    例子:

    #include<stdio.h>

    #include<unistd.h>

    void deal()

    {

       printf(“信号干扰! ”);

    }

    void main()

    {

         printf(“进程执行! ”);

        signal(SIGINT,deal);

        pause();

        printf(“进程结束! ”);

    }

    说明:

    当程序运行时,pause会使当前的进程挂起(进入睡眠状态),直到我们向该进程发送SIGINT中断信号,进程才会被唤醒,并处理信号,处理完信号后pause函数才返回,并继续运行该程序。注:任何信号都可是pause唤醒。

    sigsuspend函数:

       #include<signal.h>

       intsigsuspend(const sigset_t *sigmask);

                                      返回值:-1

    sigsuspend函数和pause函数一样,可以是进程挂起(进入睡眠状态),直至有信号发生。

    sigsuspend函数的参数是一个信号集,这个信号集是用来屏蔽信号的,信号集中存放了要屏蔽的信号。

    如果该信号集为空的话,sigsuspend就不屏蔽任何信号,任何信号都可以使进程从挂起状态唤醒,这就与pause函数一样了。

    例子:

    #include<stdio.h>

    #include<unistd.h>

    #include<signal.h>

    void deal()

    {

       printf(“信号干扰! ”);

    }

    void main()

    {

    sigset_tsigmask;

    sigemptyset(&sigmask);

         printf(“进程执行! ”);

        signal(SIGINT,deal);

        sigsuspend(&sigmask);

        printf(“进程结束! ”);

    }

    说明:

    该例子与上面pause函数的例子是一样的。

    sigsuspendpause的不同处:

     

    sigsuspend函数是pause函数的增强版。当sigsuspend函数的参数信号集为空信号集时,sigsuspend函数是和pause函数是一样的,可以接受任何信号的中断。

    但,sigsuspend函数可以屏蔽信号,接受指定的信号中断。

    sigsuspend函数=pause函数+指定屏蔽信号

     

    注:信号中断的是sigsuspendpause函数,不是程序代码。

    sigsuspend是否影响sigprocmask屏蔽的信号呢?

                                                                   影响.使原来的屏蔽信号全部失效.

                                                                   当sigsuspend返回,恢复原来的屏蔽信号.、

    sigsuspend什么时候使用?

         当我们的程序在进行一些业务处理的时候不想被一些信号所中断,我们就可以先屏蔽这些信号,在这个业务处理结束时我们可以使用sigsuspend函数处理在排队的信号(在这个过程中也可指定屏蔽的信号),处理完成后,在恢复之前的信号屏蔽,并处理下个业务处理。

    例子:

    #include<stdio.h>

    #include<unistd.h>

    #include<signal.h>

    void   deal()

    {

         printf(“信号处理中! ”);

    }

    void   main()

    {

        sigset_t  sigs,sigmask;

        int  i;

        signal(SIGINT,deal);

         sigemptyset(&sigs);            //sigsuspend的信号集设置空,表示会sigsuspend会处//理任何信号,如果想在处理排队的信号时屏蔽一些 //信号,可以把相应的信号加到信号集中

        sigemptyset(&sigmask);

        sigaddset(SIGINT,&sigs);

         sigprocmask(SIG_BLOCK,&sigs,0);  //屏蔽sigint信号,使其不能再业务处理过程中干//扰进程。

        for(i=0 ; i<5 ; i++)

      {

             printf(“处理业务中….. ”);    //模拟业务处理

             sleep(5)

             printf(“处理业务结束 ”);

            sigsuspend(&sigmask);       //处理正在排队的信号,处理信号完毕后,

    //sigsuspend函数才返回,并执行下个业务处理

           

            printf(“处理业务中….. ”);    //模拟业务处理

             sleep(5)

             printf(“处理业务结束 ”);

      }    

    }

    说明:在sigsuspend函数调用时,会使进程挂起(进入睡眠状态)等待信号的中断,如果没有信号发生,进程会一直挂起,当有信号发生时,但该信号不是sigsuspend函数的信号集中所设置的屏蔽的信号时,sigsuspend会处理该信号,当该信号处理完成后,sigsuspend函数才返回,并执行接下来的代码。

     

     

       

      

         

  • 相关阅读:
    CVPR2020:三维实例分割与目标检测
    CVPR2020:视觉导航的神经拓扑SLAM
    使用现代C++如何避免bugs(下)
    使用现代C++如何避免bugs(上)
    蓝牙mesh网络技术的亮点
    电路功能和优点
    ARM的突破:超级计算机和Mac
    所有处理都走向AI
    Wide-Bandgap宽禁带(WBG)器件(如GaN和SiC)市场将何去何从?
    功率半导体碳化硅(SiC)技术
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253906.html
Copyright © 2011-2022 走看看