sigprocmask sigaction

sigprocmask sigaction sigprocmask:用于随时添加信号屏蔽字;sigaction :signal增强版本,当处理信号时,可以随意添加信号屏蔽字sigset_tnewmask,oldmask,pendmask;signal(SIGINT,sig_handler);sigemptyset(&newmask);sigaddset(&…

大家好,又见面了,我是你们的朋友全栈君。

 

sigprocmask: 用于随时添加信号屏蔽字 ;

sigaction  : signal增强版本, 当处理信号时, 可以随意添加信号屏蔽字

   

   sigset_t newmask,oldmask,pendmask;
   signal(SIGINT,sig_handler);
   sigemptyset(&newmask);
   sigaddset(&newmask,SIGINT);

   //屏蔽SIGINT 
   sigprocmask(SIG_BLOCK,&newmask,&oldmask);
   //按ctrl+c
   for(int i =0 ; i < 3 ; ++i){
       sleep(1);
       write(1,".",1);
   }
  //SIGINT 是否置位
   sigpending(&pendmask);
   printf("pend sigint ?  %d\n",sigismember(&pendmask,SIGINT));
   puts("restore mask");
 //还原
   sigprocmask(SIG_SETMASK,&oldmask,NULL);
   puts("sigint unlock");

    while(1){
        sleep(1);
        write(1,".",1);
    }
void sig_handler(int sig,siginfo_t * info, void *p){

    printf("self pid:%d, send pid:%d , val:%d\n", getpid(),
    info->si_pid,info->si_value.sival_int);
}
int main(int argc , char ** argv , char ** env)
{
   struct sigaction act,oact;
   sigemptyset(&act.sa_mask);
   act.sa_flags =SA_SIGINFO;
   act.sa_sigaction = sig_handler;
   //act.sa_mask 用于屏蔽信号,当 sig_handler 被处理时
   sigaction(SIGUSR2,&act,&oact);
   pid_t  pid = getpid();
   printf("parent : %d\n", pid);
   if(fork() == 0){
            //子进程继承父进程 sigaction
            union  sigval v = {0};
            v.sival_int = 1000;
            pid_t pid = getpid();
            printf("child pid:%d sending sig\n", pid);
            sigqueue(getppid(),SIGUSR2,v);
            raise(SIGUSR2);

            for(int i = 0; i < 3; ++i){
                sleep(1);
                write(1,"b",1);
            }
            exit(0);
   }
   while(1){
       write(1,".",1);
       sleep(1);
   }





    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141368.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 十六进制与十进制的互相换换计算

    十六进制与十进制的互相换换计算十六进制与十进制的互相换换计算

    2022年4月22日
    45
  • 从零开始ARM裸机开发之建立开发环境

    从零开始ARM裸机开发之建立开发环境从零开始ARM裸机开发之建立开发环境                                   –参考朱有鹏ARM裸机课程1、前言:以前学过TQ2440的程序,在Ubuntu中建立的环境是不符合S5PV210需要的开发环境的这篇博文主要讲解一下建立一个简单的嵌入式开发环境需要什么?2、回

    2022年5月6日
    72
  • Lefse本地运行并更换颜色

    Lefse本地运行并更换颜色首先是lefse的安装由于lefse使用的环境比较早,建议使用conda虚拟环境的方式安装,可以省掉不少麻烦condacreate-nlefsepython=2.7python=2.7#python这里选成2.7否则会卡住环境安装完成后,进入环境安装lefsesourceactivatelefsecondainstalllefse…

    2022年5月9日
    49
  • 常用的前端JavaScript方法封装

    常用的前端JavaScript方法封装1、输入一个值,返回其数据类型functiontype(para){returnObject.prototype.toString.call(para)}2、数组去重functionunique1(arr){return[…newSet(arr)]}functionunique2(arr){varobj={};returnarr.filter(ele=>{if(!obj[ele])..

    2022年7月11日
    17
  • pycharm条件断点_进行质量管理的基础是

    pycharm条件断点_进行质量管理的基础是编辑器不等于IDE(集成开发环境),开发python程序,不是只有一种print()打印输出调试。术业有专攻,于人如此,于一个软件也是如此。让专业的软件做专业的事。以上两点得出的结论:PyCharm

    2022年8月25日
    6
  • vuex mapGetters的使用「建议收藏」

    vuex mapGetters的使用「建议收藏」importVuefrom’vue’;importVuexfrom’vuex’;Vue.use(Vuex);conststore=newVuex.Store({state:{name:’张三’,number:0,list:[{id:1,name:’111′},{id:2,name:’222′},{id:3,

    2022年5月29日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号