【进程】进程通信-信号方式(中断)
信号方式(中断)
信号的基本概念
每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一种模拟,故又把它称为软中断。
信号与中断的相似点
(1)采用了相同的异步通信方式;
(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3)都在处理完毕后返回到原来的断点;
(4)对信号或中断都可进行屏蔽。
信号与中断的区别
(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。
信号机制
(1)发送信号。发送信号的程序用系统调用kill( )实现;
(2)预置对信号的处理方式。接收信号的程序用signal( )来实现对处理方式的预置;
(3)收受信号的进程按事先的规定完成对相应事件的处理。
对信号的处理
当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。对软中断信号的处理分三种情况进行:
(1)如果进程收到的软中断是一个已决定要忽略的信号(function=1),进程不做任何处理便立即返回;
(2)进程收到软中断后便退出(function=0);
(3)执行用户设置的软中断处理程序。
中断调用kill
int kill(pid,sig)
参数定义
int pid,sig;
其中,pid是一个或一组进程的标识符,参数sig是要发送的软中断信号。
(1)pid>0时,核心将信号发送给进程pid。
(2)pid=0时,核心将信号发送给与发送进程同组的所有进程。
(3)pid=-1时,核心将信号发送给所有用户标识符真正等于发送进程的有效用户标识号的进程。
signal(sig,function)
预置对信号的处理方式,允许调用进程控制软中断信号。
示例程序
1 // @author 成鹏致远 2 // @net http://infodown.tap.cn 3 // @qq 552158509 4 5 #include <signal.h> 6 #include <unistd.h> 7 #include <stdio.h> 8 #include <sys/time.h> 9 10 void SignalHandle(int signal)//信号处理函数 11 { 12 switch(signal) 13 { 14 case SIGHUP://在用户终端连接(正常或非正常)结束时发出 15 printf("Catch Signal:SIGHUP(%d)\n ",signal); 16 break; 17 case SIGINT://用户键入INTER字符(通常是Ctrl+C) 18 printf("Catch Signal:SIGINT(%d)\n ",signal); 19 break; 20 case SIGQUIT://由QUIT字符控制(通常是Ctrl+\) 21 printf("Catch Signal:SIGHUP(%d)\n ",signal); 22 break; 23 case SIGALRM://定时器信号 24 printf("Catch Signal:SIGALRM(%d)\n",signal); 25 break; 26 default: 27 printf("Unknown Signal:%d",signal); 28 break; 29 } 30 } 31 32 int main() 33 { 34 int sec_delay=5; 35 36 printf("Current Process ID:%d\n",(int)getpid()); 37 38 signal(SIGINT,SignalHandle); //注册信号和与之对应的信号处理函数 39 signal(SIGQUIT,SignalHandle); 40 signal(SIGALRM,SignalHandle); 41 42 alarm(sec_delay); //设置定时器 43 while(1) 44 pause();//用于将进程挂起直到收到信号为止 45 46 return 0; 47 }