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


相关推荐

  • c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

    c浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别先考虑一种情况,对一个已知对象进行拷贝,编译系统会自动调用一种构造函数——拷贝构造函数,如果用户未定义拷贝构造函数,则会调用默认拷贝构造函数。先看一个例子,有一个学生类,数据成员时学生的人数和名字:#include<iostream>usingnam…

    2022年9月1日
    0
  • intellij idea 怎么查看方法在哪里被调用_进入接口

    intellij idea 怎么查看方法在哪里被调用_进入接口在接口的左边有个向下的小箭头,点击小箭头就能看到接口的实现类和方法的实现:在实现类的左边有个向上的小箭头,可以查看被实现的接口和被覆盖重写的方法:

    2022年8月15日
    12
  • springboot eclipse 热部署

    springboot eclipse 热部署springboot热部署配置很简单,并且配置好后开发变的非常舒服,修改东西后再也不用重新启动服务了!一、pom.xml添加依赖       org.springframework.boot        spring-boot-devtools        true                  org.springframework

    2022年5月20日
    27
  • adb 命令大全_整理磁盘碎片的命令

    adb 命令大全_整理磁盘碎片的命令adb是什么?:adb的全称为AndroidDebugBridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听SocketTCP5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse时adb进程就会自…

    2022年4月20日
    105
  • git clone 指定分支和切换分支[通俗易懂]

    git clone 指定分支和切换分支[通俗易懂]gitclone指定分支:gitclone-b分支名称项目地址假设分支名称为test,则:gitclone-btest项目地址git命令查看当前分支:gitbranchgit命令切换分支:gitcheckout分支名…

    2022年7月21日
    36
  • 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)[通俗易懂]

    目录:0、引言何为嵌入式?1、单片机相关1.1基于单片机的智能小车、智能机器人制作1.2基于Arduino的3D打印机制作2、嵌入式Linux相关2.1智能扫地机器人2.2智能可穿戴类设备:智能安全头盔2.3智能可穿戴类设备:面向空巢老人/病人的智能手环2.4物联网智能控制系统:家居、农业、医疗2.5基于Linux的嵌入式网络视频监控系统…

    2022年4月6日
    32

发表回复

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

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