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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea2021.12永久激活-激活码分享

    (idea2021.12永久激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月30日
  • 计算机的发展历史_计算器的由来和故事

    计算机的发展历史_计算器的由来和故事本文主要介绍计算机的发展历史。1概述计算工具的演化经历了由简单到复杂、从低级到高级的不同阶段,从“结绳记事”中的绳结到算筹、算盘、计算尺、机械计算机等,它们在不同的历史时期发挥了各自的历史作用,同时也启发了现代电子计算机的研制思想。1889年,美国科学家赫尔曼·何乐礼研制出以电力为基础的电动制表机,用以储存计算资料。1930年,美国科学家范内瓦·布什造出世界上首台模拟电子计算机。…

    2022年8月31日
  • 2.在Ubuntu中安装 PyCharm的步骤[通俗易懂]

    2.在Ubuntu中安装 PyCharm的步骤[通俗易懂]在Ubuntu下安装PyCharm软件的详细步骤介绍

    2022年10月31日
  • 画用例图_uml活动图怎么画

    画用例图_uml活动图怎么画用例图。组成:系统边界。参与者。用例。关系。参与者:Actor不是人,而是指参与用例时担当的角色。如果一个角色的操作是由另一个角色代理完成的,请建立该角色到另外角色之间的依赖。怎样识别参与者呢? 是谁向系统提供的信息呢. 谁向系统获取信息。 谁操作系统。 系统使用哪些外部资源 系统是否和已经存在的系统交互 系统、子系统或类与外…

    2022年9月6日
  • 狂神说Java全栈学习路线

    狂神说Java全栈学习路线很多同学学习Java苦于没有自己的完整学习步骤,在这里,秦老师给大家奉上一份完整的学习计划~干货满满,关注收藏转发呀!不胜感激!一、Java基础二、JavaWeb三、SSM框架四、Lin…

    2022年5月16日
  • JS对象转数组_js怎么把数组转成对象

    JS对象转数组_js怎么把数组转成对象arrFun(){letmeilihao={lufei:’船长’,suolong:’副船长’,namei:’航海士’,wusuopu:’狙击手’}letarr=Object.values(meilihao)letarr2=Object.keys(meilihao)console.log(arr,arr2)}打印结果:…

    2022年9月13日

发表回复

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

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