zoukankan      html  css  js  c++  java
  • Linux进程管理—信号、定时器

    信号:

    1.       信号的作用:

           背景:

                 进程之间通信比较麻烦。

                 但进程之间又必须通信,比如父子进程之间。

           作用:

                通知其他进程响应。进程之间的一种通信机制。

                信号:

                      接受信号的进程马上停止,调用信号处理函数。

                信号处理函数:

                             默认处理函数

                                  打印信号信息,退出进程。

                             用户处理函数。

           中断:接受信号的进程马上停止,有信号发生时,处理信号,进程中断,信号处理结束,返回进程继续执行。

                 软中断

           案例:

                1.进程之中,默认信号处理

                     2.进程之中,用户信号处理

                     3.中断

           命令:

                kill –s 信号  进程ID

                信号:数字1-31 34-64

                                 宏SIGINT=2

                  ctrl+d 发送信号2 SIGINT(中断信号)

                  kill -l察看所有信号

           

            信号SIGKILLSIGSTOP不能被处理.(只能调用默认处理函数)

    信号的注册,信号与函数绑定(用户处理函数)

    #include<stdio.h>

    #include<unistd.h>

    #include<signal.h>

    voidhandle()

    {

          printf(“信号发生! ”);

    }

    voidmain()

    {

           signal(SIGINGT , handle);

           while(1)

           {

                  printf(“进程执行中 ”);

                  sleep(1);

           }

    }

    向该进程发送SIGINT(中断信号),进程调用函数handle

    说明:

    如果信号没有绑定函数,向进程发送了信号,则进程调用默认处理函数:打印信号信息,进程退出。

    如果信号绑定了函数,向进程发送相应的信号,则进程调用用户处理函数。

    使用程序发生信号:

        发送信号

                  int kill(pid_t pid,int s);

            第一个参数:pid:进程ID,向该进程发送信号。

            第二个参数:s:信号,发送的信号

    进程ID的要求:

                 >0:发送信号到指定进程

                 =0:发送信号到该进程所在进程组的所有进程

                           -1:发送给所有进程,除init外

                           <0:发送给指定的进程组(组ID=绝对值)

    例子:

    Signal.c

    #include<stdio.h>

    #include<unistd.h>

    #include<signal.h>

    voidhandle()

    {

          printf(“信号发生! ”);

    }

    voidmain()

    {

           signal(SIGINGT , handle);

           while(1)

           {

                  printf(“进程执行中%d ,getpid()”);

                  sleep(1);

           }

    }

    Kill.c

    #include<stdio.h>

    #include<signal.h>

    void  main()

    {

         while(1)

         {

             kill(3828,SIGINT);

             sleep(2);

         }

    }

    信号的应用:

    1.       延时器timeout

              延长器信号:SIGALRM

              信号发出函数:alarm

               #include<unistd.h>

               unsigned int alarm(unsigned int seconds);

                在指定的时间发送信号 ,指向本进程发送该信号,只发送一次。

    例子:

    #include<stdio.h>

    #include<signal.h>

    voiddeal()

    {

        printf(“起床了!”);

    }

    void  main()

    {

           signal(SIGALRM , deal);

           alarm(5);     //5秒钟后,发送信号

           while(1)

           {

                  //进程处理

           }

    }

    2.       定时器

    int setitimer(int which,//计时方式

    //ITIMER_REAL真实事件(时钟时间) / ITIMER_VIRTUAL 进程时间(进程运行时间) /ITIMER_PROF混合时间

                   const struct itimerval *val,//定时器的时间参数

                   struct itimerval *oldval);//返回原来设置的定时器

    //如果=NULL,则不返回

    struct itimerval

                         {

                                       struct timevalit_interval;//间隔时间

                                       structtimeval it_value;//延时时间

                         }

    structtimeval

                         {

                                 long tv_sec; //秒

                                 long tv_usec;//微秒

                         }

     

    例子:

    #include<stdio.h>

    #include<signal.h>

    #include<sys/time.h>

    voiddeal()

    {

        printf(“起床了! ”);

    }

    voidmain()

    {

         itimerval val;

         Signal(SIGALRM,deal);

         //描述定时器

         val.it_interval.tv_sec=3;    //间隔时间设置为3秒,则程序启动后,3秒钟会触发时器,发送信号SIGALRM

         val.it_value.tv_sec=1;      //触发定时器后,每1秒钟触发一次定时器

         setitimer(ITIMER_REAL,&val,0);  //设置定时器

         //如果想程序一启动就触发定时器

         //val.it_interval.tv_sec=0;

       //val.it_interval.tv_usec=1; 毫秒设置为1秒,不能把秒和毫秒都设置为0,会使程序无法触发定时器的

         while(1)

         {

             printf(“进程执行中! ”);

         }

        

         

    }

  • 相关阅读:
    CSS中的小知识
    网络基础 中的osi七层 协议
    pickle的使用
    max()的key的运用
    read,readline,readlines的区别
    print()控制台输出带颜色的方法
    写项目时bin目录下的start中的细节(路径问题的解决)
    使用hashlib密文存储实例
    固态硬盘使用f2fs作为根分区安装linux
    工厂方法(Factory Method)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253787.html
Copyright © 2011-2022 走看看