天天看點

【程序】程序通信-信号方式(中斷)

信号方式(中斷)

信号的基本概念

  每個信号都對應一個正整數常量(稱為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 }      

View Code

QQ聯系方式:[email protected]

【程式】程式通信-信号方式(中斷)

出處:lcw.cnblogs.com

郵箱:[email protected]

本文申明:本文版權歸作者和部落格園共有,歡迎轉載,轉載請注明出處.

繼續閱讀