信号:

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(“信号发生!\n”);

}

 

voidmain()

{

       signal(SIGINGT , handle);

       while(1)

       {

              printf(“进程执行中\n”);

              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(“信号发生!\n”);

}

 

voidmain()

{

       signal(SIGINGT , handle);

       while(1)

       {

              printf(“进程执行中%d\n,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(“起床了!\n”);

}

 

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(“进程执行中!\n”);

     }

    

     

}