进程间通讯之信号

1、信号的概念:信号是系统预先定义好的某些特定事件。接收到该信号的进程会采取相应的行动。

               信号可以被产生,可以被接受。信号产生和接受的主体都是进程。

2、信号在系统中的定义:/usr/include/bits/signum.h/

3、信号怎样使用:

1)信号如何发送:进程可以通过调用kill函数向包括它在内的其他进程发送一个信号。如果程序没有发送该信号的权限,

     则对kill函数将调用失败,失败的常见原因是目标文件由另一个用户所拥有。

     Int kill pid_t pid , int signum

     Kill函数把参数signum指定的信号发送给由参数pid给出的进程号指定的进程。

     成功时返回0,失败时返回-1

 

      Pid > 0     (向pid指定的进程发送信号)

      Pid == 0    (发送给同一进程组的所有进程)

      Pid == -1   (发送给所有进程,除系统进程)

      Pid < -1    将信号传给进程组识别码为pid绝对值的所有进程

 

    Int raiseint signum//向调用这个函数的进程发送一个signum指定的信号

    ==int kill getpid(),int signum

(2)信号如何接受  &  signal 函数的底层实现

      在进程PCB中成员变量signal来表示接收到的信号

      task_struct *p = 当前进程的PCB

      P->signal  |=  1<<(signum - 1)

 

       signal函数的实现原理:信号绑定信号处理函数

 

           Int sys_signal(int signum ,long handler)

          {

                If(signum < 1 || signum > 32 || signum == SIGKILL)

                   return  -1;

               Current->sigation[signum - 1].sa_handle = handler;

               return 0;

           }    

当信号发生后,设置PCBsignal成员变量的值,通过signal的值计算出收到的信号的值signum

Call PCB->sigaction[signum - 1].sa_handler.

      

(2)信号接收以后做什么事情

    

  信号的响应方式:

         a.)默认  SIG_DFI  表示接收到此信号后的动作是系统默认动作

         b.)忽略  SIG_IGN  则向内核表示忽略此信号(有两个信号SIGKILL SIGSTOP不能忽略)

         C.)自定义(捕捉) 自己写的函数  信号发生时调用该函数,我们称这种处理为“捕捉”该信号。称此函数为信号处理程序或信号捕捉函数。

  

怎样修改信号的响应方式:

  typedef void (*Fun_Handle)(int)

  Fun_Handle signal(int signum ,Fun_Handle fun)

   SIGINT      当用户按中断键(一般为DELETEctrl + c)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程。

            当一个进程运行失控时,特别是屏幕上产生大量不必要的输出,常用此信号终止它。

  SIGCHLD  在一个进程终止或停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。

           如果父进程希望被告知其子进程的这种状态改变,则应捕捉此信号。信号捕捉函数中通常要调用wait 这个函数来获取子进程id和终止状态。

 

signal函数功能:完成signum参数指定的信号与函数fun的绑定,当接受到signum这个信号执行fun函数。

  

如果第一次接受到信号,进入信号处理函数,主函数不会同时执行,主函数会等待信号处理函数执行完成后再接着运行。

 

如果信号处理函数正在被执行,信号再次被触发,则第二次触发的信号会被放到信号的等待队列当中,直到之前的信号处理函数执行完成,才会被处理。

 

 

转载于:https://www.cnblogs.com/97-5-1/p/7804815.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值