久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之:信號

進程間通信之:信號

作者: 時間:2013-09-13 來源:網絡 收藏

本文引用地址:http://cqxgywz.com/article/257126.htm

8.3

8.3.1概述

是UNIX中所使用的進程通信的一種最古老的方法。它是在軟件層次上對中斷機制的一種模擬,是一種異步通信方式。信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。它可以在任何時候發給某一進程,而無需知道該進程的狀態。如果該進程當前并未處于執行態,則該信號就由內核保存起來,直到該進程恢復執行再傳遞給它為止;如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時才被傳遞給進程。

在第2章kill命令中曾講解到“−l”選項,這個選項可以列出該系統所支持的所有信號的列表。在筆者的系統中,信號值在32之前的則有不同的名稱,而信號值在32以后的都是用“SIGRTMIN”或“SIGRTMAX”開頭的,這就是兩類典型的信號。前者是從UNIX系統中繼承下來的信號,為不可靠信號(也稱為非實時信號);后者是為了解決前面“不可靠信號”的問題而進行了更改和擴充的信號,稱為“可靠信號”(也稱為實時信號)。那么為什么之前的信號不可靠呢?這里首先要介紹一下信號的生命周期。

一個完整的信號生命周期可以分為3個重要階段,這3個階段由4個重要事件來刻畫的:信號產生、信號在進程中注冊、信號在進程中注銷、執行信號處理函數,如圖8.6所示。相鄰兩個事件的時間間隔構成信號生命周期的一個階段。要注意這里的信號處理有多種方式,一般是由內核完成的,當然也可以由用戶進程來完成,故在此沒有明確畫出。

圖8.6信號生命周期

一個不可靠信號的處理過程是這樣的:如果發現該信號已經在進程中注冊,那么就忽略該信號。因此,若前一個信號還未注銷又產生了相同的信號就會產生信號丟失。而當可靠信號發送給一個進程時,不管該信號是否已經在進程中注冊,都會被再注冊一次,因此信號就不會丟失。所有可靠信號都支持排隊,而所有不可靠信號都不支持排隊。

注意

這里信號的產生、注冊和注銷等是指信號的內部實現機制,而不是調用信號的函數實現。因此,信號注冊與否,與本節后面講到的發送信號函數(如kill()等)以及信號安裝函數(如signal()等)無關,只與信號值有關。

用戶進程對信號的響應可以有3種方式。

n 忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即SIGKILL及SIGSTOP。

n 捕捉信號,定義信號處理函數,當信號發生時,執行相應的自定義處理函數。

n 執行缺省操作,對每種信號都規定了默認操作。

中的大多數信號是提供給內核的,表8.6列出了中最為常見信號的含義及其默認操作。

表8.6 常見信號的含義及其默認操作

信號名

含義

默認操作

SIGHUP

該信號在用戶終端連接(正常或非正常)結束時發出,通常是在終端的控制進程結束時,通知同一會話內的各個作業與控制終端不再關聯

終止

SIGINT

該信號在用戶鍵入INTR字符(通常是Ctrl-C)時發出,終端驅動程序發送此信號并送到前臺進程中的每一個進程

終止

SIGQUIT

該信號和SIGINT類似,但由QUIT字符(通常是Ctrl-)來控制

終止

SIGILL

該信號在一個進程企圖執行一條非法指令時(可執行文件本身出現錯誤,或者試圖執行數據段、堆棧溢出時)發出

終止

SIGFPE

該信號在發生致命的算術運算錯誤時發出。這里不僅包括浮點運算錯誤,還包括溢出及除數為0等其他所有的算術錯誤

終止

SIGKILL

該信號用來立即結束程序的運行,并且不能被阻塞、處理或忽略

終止

SIGALRM

該信號當一個定時器到時的時候發出

終止

SIGSTOP

該信號用于暫停一個進程,且不能被阻塞、處理或忽略

暫停進程

SIGTSTP

該信號用于交互停止進程,用戶鍵入SUSP字符時(通常是Ctrl+Z)發出這個信號

停止進程

SIGCHLD

子進程改變狀態時,父進程會收到這個信號

忽略

SIGABORT

進程異常終止時發出

linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

模擬信號相關文章:什么是模擬信號


linux相關文章:linux教程


數字通信相關文章:數字通信原理


通信相關文章:通信原理



上一頁 1 2 3 4 5 6 7 下一頁

評論


相關推薦

技術專區

關閉