日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/9 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【进程】进程通信-信号方式(中断) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

信號方式(中斷)

信號的基本概念

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

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/lcw/p/3235994.html

總結

以上是生活随笔為你收集整理的【进程】进程通信-信号方式(中断)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。