亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

深入理解進程間通信之信號

2024-06-28 13:19:42
字體:
來源:轉載
供稿:網友
深入理解進程間通信之信號信號及信號源

信號本質

  信號是在軟件層次上對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達。

  信號是進程間通信機制中唯一的異步通信機制,可以看作是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過POSIX實時擴展后,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。

信號來源

  信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發送信號的系統函數是kill, raise, alarm和setitimer以及sigqueue函數,軟件來源還包括一些非法運算等操作。

信號的種類

  系統支持的所有信號如下所示:

  進程可以屏蔽掉大多數信號,除了SIGSTOP和SIGKILL。

進程對信號的響應

  進程可以通過三種方式來響應一個信號:(1)忽略信號,即對信號不做任何處理,其中,有兩個信號不能忽略:SIGKILL及SIGSTOP;(2)捕捉信號。定義信號處理函數,當信號發生時,執行相應的處理函數;(3)執行缺省操作,linux對每種信號都規定了默認操作。注意,進程對實時信號的缺省反應是進程終止。

  Linux究竟采用上述三種方式的哪一個來響應信號,取決于傳遞給相應API函數的參數。

信號的安裝

  如果進程要處理某一信號,那么就要在進程中安裝該信號。安裝信號主要用來確定信號值及進程針對該信號值的動作之間的映射關系,即進程將要處理哪個信號;該信號被傳遞給進程時,將執行何種操作。

  Linux主要有兩個函數實現信號的安裝:signal()、sigaction()。其中signal()在可靠信號系統調用的基礎上實現, 是庫函數。它只有兩個參數,不支持信號傳遞信息,主要是用于前32種非實時信號的安裝;而sigaction()是較新的函數(由兩個系統調用實現:sys_signal以及sys_rt_sigaction),有三個參數,支持信號傳遞信息,主要用來與 sigqueue() 系統調用配合使用,當然,sigaction()同樣支持非實時信號的安裝。sigaction()優于signal()主要體現在支持信號帶有參數。

signal
  typedef void (*sighandler_t)(int);  sighandler_t signal(int signum, sighandler_t handler));

  第一個參數指定信號的值,第二個參數指定針對前面信號值的處理,可以忽略該信號(參數設為SIG_IGN);可以采用系統默認方式處理信號(參數設為SIG_DFL);也可以自己實現處理方式(參數指定一個函數地址)。

  如果signal()調用成功,返回最后一次為安裝信號signum而調用signal()時的handler值;失敗則返回SIG_ERR。

sigaction
  int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

  sigaction函數用于改變進程接收到特定信號后的行為。該函數的第一個參數為信號的值,可以為除SIGKILL及SIGSTOP外的任何一個特定有效的信號(為這兩個信號定義自己的處理函數,將導致信號安裝錯誤)。第二個參數是指向結構sigaction的一個實例的指針,在結構 sigaction的實例中,指定了對特定信號的處理,可以為空,進程會以缺省方式對信號處理;第三個參數oldact指向的對象用來保存原來對相應信號的處理,可指定oldact為NULL。如果把第二、第三個參數都設為NULL,那么該函數可用于檢查信號的有效性。

  第二個參數最為重要,其中包含了對指定信號的處理、信號所傳遞的信息、信號處理函數執行過程中應屏蔽掉哪些函數等等。

信號的發送

  發送信號的主要函數有:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。

kill
  int kill(pid_t pid, int signo);

  signo是信號值,當為0時(即空信號),實際不發送任何信號,但照常進行錯誤檢查,因此,可用于檢查目標進程是否存在,以及當前進程是否具有向目標發送信號的權限(root權限的進程可以向任何進程發送信號,非root權限的進程只能向屬于同一個session或者同一個用戶的進程發送信號)。

raise
  int raise(int signo);

  向進程本身發送信號,參數為即將發送的信號值。調用成功返回 0;否則,返回 -1。

sigqueue
  int sigqueue(pid_t pid, int signo, const union sigval val);

  sigqueue()與函數sigaction()配合使用,sigqueue的第一個參數是指定接收信號的進程ID,第二個參數確定即將發送的信號,第三個參數是一個聯合數據結構union sigval,指定了信號傳遞的參數,即通常所說的4字節值。

  sigqueue()比kill()傳遞了更多的附加信息,但sigqueue()只能向一個進程發送信號,而不能發送信號給一個進程組。如果signo=0,將會執行錯誤檢查,但實際上不發送任何信號,0值信號可用于檢查pid的有效性以及當前進程是否有權限向目標進程發送信號。在調用sigqueue時,sigval_t指定的信息會拷貝到3參數信號處理函數(3參數信號處理函數指的是信號處理函數由 sigaction安裝,并設定了sa_sigaction指針)的siginfo_t結構中,這樣信號處理函數就可以處理這些信息了。由于 sigqueue系統調用支持發送帶參數信號,所以比kill()系統調用的功能要靈活和強大得多。

  注:sigqueue()發送非實時信號時,第三個參數包含的信息仍然能夠傳遞給信號處理函數; sigqueue()發送非實時信號時,仍然不支持排隊,即在信號處理函數執行過程中到來的所有相同信號,都被合并為一個信號。

alarm
  unsigned int alarm(unsigned int seconds);

  專門為SIGALRM信號而設,在指定的時間seconds秒后,將向進程本身發送SIGALRM信號,又稱為鬧鐘時間。進程調用alarm后,任何以前的alarm()調用都將無效。如果參數seconds為零,那么進程內將不再包含任何鬧鐘時間。返回值,如果調用alarm()前,進程中已經設置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回0。

settimer
  int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));

  setitimer()比alarm功能強大,支持3種類型的定時器:

  • ITIMER_REAL: 設定絕對時間;經過指定的時間后,內核將發送SIGALRM信號給本進程;
  • ITIMER_VIRTUAL 設定程序執行時間;經過指定的時間后,內核將發送SIGVTALRM信號給本進程;
  • ITIMER_PROF 設定進程執行以及內核因本進程而消耗的時間和,經過指定的時間后,內核將發送ITIMER_VIRTUAL信號給本進程;

  setitimer()第一個參數which指定定時器類型(上面三種之一);第二個參數是結構itimerval的一個實例;第三個參數可不做處理。setitimer()調用成功返回0,否則返回-1。

abort
  void abort(void); 

  向進程發送SIGABORT信號,默認情況下進程會異常退出,當然可定義自己的信號處理函數。即使SIGABORT被進程設置為阻塞信號,調用abort()后,SIGABORT仍然能被進程接收。該函數無返回值。

信號生命周期

  對于一個完整的信號生命周期(從信號發送到相應的處理函數執行完畢)來說,可以分為三個重要的階段,這三個階段由四個重要事件來刻畫:信號誕生;信號在進程中注冊完畢;信號在進程中的注銷完畢;信號處理函數執行完畢。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩天堂一区二区| 国产精品久久久久久久app| 亚洲美女在线看| 欧美成人精品一区二区| 欧美裸体xxxx极品少妇软件| 色妞欧美日韩在线| 亚洲精品suv精品一区二区| 国模精品系列视频| 欧美国产日韩在线| 国产精品入口夜色视频大尺度| 亚洲国产成人91精品| 亚洲一区二区免费在线| 欧美日韩一区二区免费在线观看| 欧美日韩色婷婷| 成人免费观看a| 久久好看免费视频| 国产成人一区二区三区小说| 欧美一级大片在线观看| 国产精品成人免费电影| 成人性生交大片免费看小说| 久久久久久久久爱| 国产情人节一区| 国内精品模特av私拍在线观看| 亚洲老板91色精品久久| 国产免费成人av| 97avcom| 91精品国产高清自在线看超| 高清一区二区三区日本久| 亚洲在线免费视频| 亚洲一区二区三区乱码aⅴ| 国产一区二区三区三区在线观看| 国语自产在线不卡| 精品久久久免费| 91极品女神在线| 韩日精品中文字幕| 成人在线精品视频| 亚洲国产欧美久久| 97碰在线观看| 国产精品 欧美在线| 自拍亚洲一区欧美另类| 欧美成人中文字幕| 精品美女永久免费视频| 最新日韩中文字幕| 亚洲成年人在线播放| 色综合亚洲精品激情狠狠| 欧美精品在线网站| www.久久久久久.com| 国产视频亚洲精品| 久久久久久97| 欧美日韩亚洲一区二区| 日韩av在线精品| 成人福利视频网| 国产亚洲精品久久久久久| 欧美成人亚洲成人日韩成人| 欧美大片免费观看在线观看网站推荐| 日韩中文字幕免费| 国产免费一区二区三区在线观看| 91av网站在线播放| 在线观看欧美成人| 久久久免费高清电视剧观看| 成人av在线亚洲| 日韩成人av一区| 欧美成人三级视频网站| 日韩亚洲成人av在线| 亚洲在线视频观看| 日韩电影免费在线观看中文字幕| 国产精品第2页| 久久精品中文字幕一区| 亚洲片国产一区一级在线观看| 国产成人av网| 日韩大片在线观看视频| 亚洲国产精品久久久久| 日本高清+成人网在线观看| 欧美日韩在线视频观看| 国产在线精品自拍| 91精品国产99| 日韩在线观看高清| 日韩电影中文 亚洲精品乱码| 精品中文字幕久久久久久| 成人97在线观看视频| 久久人人爽亚洲精品天堂| 久久精品电影一区二区| 色综合导航网站| 国产精品亚洲美女av网站| 日韩精品视频在线| 亚洲国产第一页| 国模视频一区二区| 久久99国产精品自在自在app| 亚洲国产精品一区二区久| 久久福利视频网| 亚洲欧美日韩国产中文专区| 亚洲日本aⅴ片在线观看香蕉| 欧美日韩人人澡狠狠躁视频| 久久天天躁狠狠躁老女人| 亚洲欧美国产精品专区久久| 91夜夜揉人人捏人人添红杏| 亚洲黄色成人网| 久久精品成人欧美大片| 欧美xxxx18性欧美| 国产欧美欧洲在线观看| 欧美国产第一页| 在线成人激情黄色| 夜夜嗨av一区二区三区四区| 久久久精品国产亚洲| 久久成人综合视频| 51精品在线观看| 国产国语videosex另类| 亚洲最大成人免费视频| 久久免费高清视频| 日本久久精品视频| 国产精品极品在线| 日韩av一卡二卡| 欧美日韩国产专区| 亚洲精品99久久久久中文字幕| 欧美另类交人妖| 欧美精品一二区| 欧美在线性视频| 97在线看免费观看视频在线观看| 久久久成人精品视频| 国内精品中文字幕| 亚洲最大成人免费视频| 麻豆国产精品va在线观看不卡| 欧美性资源免费| 国产视频观看一区| 亚洲人成免费电影| 免费不卡欧美自拍视频| 亚洲另类xxxx| 中文字幕日韩在线视频| 欧美日韩福利视频| 色综合导航网站| 色妞欧美日韩在线| 国产欧美一区二区三区在线看| 亚洲成人免费网站| 丝袜亚洲欧美日韩综合| 国产精品一区二区三| 亚洲a一级视频| 91极品视频在线| 欧美大片免费看| 亚洲欧美日韩久久久久久| 久久精品99久久久久久久久| 中文字幕欧美日韩va免费视频| 国产精品一区专区欧美日韩| 亚洲精品不卡在线| 国产精品视频地址| 欧美巨乳美女视频| 亚洲最大中文字幕| 国模精品一区二区三区色天香| 中文字幕精品久久久久| 国产啪精品视频网站| 国产午夜精品免费一区二区三区| 亚洲欧洲国产伦综合| 久久久精品国产网站| 欧美黄色片在线观看| 欧美高清视频免费观看| 国产成人精品国内自产拍免费看| 亚洲国产成人久久| 中文字幕日韩精品有码视频| 亚洲国产福利在线| 欧美男插女视频| 日韩av大片在线| 欧美福利小视频| 韩国国内大量揄拍精品视频| 最近中文字幕2019免费| 欧美日韩国产精品一区|