zoukankan      html  css  js  c++  java
  • 信号练习

    父进程给子进程发送信号
      #include<unistd.h>
    
      #include<signal.h>
      #include<sys/types.h>
    
      #include<sys/wait.h>
      #include<stdio.h>
    
      main()
    
      {
    
        pid_t pid;
    
        int status;
    
       if(!(pid= fork()))
    
        {
    
            printf("Hi I am child process!
    ");
    
            sleep(10);
    
             return;
    
         }
    
       else{
    
          printf("send signal to child process (%d) 
    ",pid);
    
          sleep(1);
    
          kill(pid ,SIGABRT);
    
          wait(&status);
    
         if(WIFSIGNALED(status))//如果子进程因为信号而结束,此宏为真!!
    
          {
    
            printf("chile process receive signal %d
    ",WTERMSIG(status));//取得子进程因为信号而终止的信号代码!
    
          }
    
       }
    
      }

    #include<unistd.h>
    
      #include<signal.h>
    
      #include<sys/types.h>
    
      #include<sys/wait.h>
      #include<stdio.h>
    
     main() 
    
      { 
    
        unsigned int i; 
    
        alarm(1); 
    
        for(i=0;1;i++) 
    
          {  
    
             printf("I=%d",i); 
    
         } 
    
       }

    //运行结果部分截图如下

    alarm()函数和时间有关系,这个函数可以在second秒后向自己发送一个SIGALRM信号。
    SIGALRM信号的默认操作时结束进程,所以程序在一秒钟以后结束!
    #include<unistd.h>
    #include<signal.h>
    
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<stdio.h>
    #include<stdlib.h>
    int main(int argc,char **argv) 
    { 
    
       double y; 
       int i=0;
    
       sigset_t intmask; 
    
       sigemptyset(&intmask); /* 将信号集合设置为空*/ 
    
       sigaddset(&intmask,SIGINT); /*加入中断Ctrl+c信号*/ 
    
       while(1) 
    
       { 
    
        /**/ 
    
       sigprocmask(SIG_BLOCK,&intmask,NULL); //阻塞信号,我们不希望保存原来的集合,所以参数为NULL
    
       fprintf(stderr,"SIGINT signal blocked
    "); 
    
       for(i= 0; i<5; i++){
        sleep(1); //
    
        fprintf(stderr,"Blocked calculation is finished
    ");
    
        }   
    
       /**/ 
    
       sigprocmask(SIG_UNBLOCK,&intmask,NULL); 
    
       fprintf(stderr,"SIGINT signal unblocked
    "); 
    
       for(i=0; i<100; i++){ 
    
        fprintf(stderr,"Unblocked calculation is finished
    "); 
    
       } 
    
       exit(0); 
    
     }
    }
    当我按下ctrl+c时,因为信号被阻塞,所以程序继续执行,等到解除阻塞时,程序停止执行!
    #include <stdio.h>
    #include <signal.h>
    typedef void (*signal_handler)(int);
    void signal_handler_fun(int signal_num)
    {
    printf(
    "catch siganl %d ",signal_num);
    }
    int main( void ) {
    signal_handler p_signal
    =signal_handler_fun; signal(SIGINT,p_signal); for(;;); return 0; }
    [root@linux leijiangtao]# gcc signal.c [root@linux leijiangtao]# .
    /a.out ^Ccatch siganl 2 ^Ccatch siganl 2 ^Ccatch siganl 2 /*可以按CTRL +C 来终止该进程了或者CTRL+ 此程序是对当我们按下CTRL +C键时,会执行我们定义的信号处理函数。 每当我们按下CTRL +C键时会打印该信号的number.可以看出该信号的num为2 要想退出可以按下CTRL + 打印结果为最后一行。*/
  • 相关阅读:
    ubuntu下如何卸载nvidia显卡驱动?
    如何加速编译linux内核模块?
    ubuntu下编译linux内核之前需要做哪些准备?
    ubuntu最近升级到最新的linux内核后,网络无法使用怎么办?
    ubuntu下如何高速下载?
    linux配置java环境变量(详细)
    Javascript 中 == 和 === 区别是什么?
    mybatis 根据多个id查询数据 foreach标签
    mybatis多参数查询问题:org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available par
    Java Array二维数组使用
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4372335.html
Copyright © 2011-2022 走看看