APUE之訊號中的一些基本概念

2021-06-28 12:50:18 字數 1569 閱讀 3650

在了解訊號機制前首先來解釋一下關於同步和非同步的區別,這裡舉乙個通俗易懂的例子就容易理解同步與非同步的概念了。

同步:就是你請我吃飯,我聽到了就和你吃飯,如果沒有聽到,你就不停的叫,直到我告訴你聽到了,才一起去吃飯。

非同步:就是你叫我,然後自己去吃飯,我得到訊息後可能立即走,也可能等到下班才去吃飯

訊號:又叫軟中斷,是軟體層次上對硬體中斷的一種模擬,原理上乙個程序收到乙個訊號與cpu

收到乙個中斷請求是一樣的。訊號提供了一種處理

非同步事件的方法。

為什麼說訊號提供了一種處理非同步事件的方法:因為乙個程序不必通過任何操作來等待訊號的到達,事實上,程序也不知道訊號到底是什麼時候到達。

訊號處理的三種方式:

(1)忽略此訊號

(2)捕捉訊號

(3)執行系統預設動作

▲注意:①當程式啟動時(即執行exec函式時)exec函式將原先設定為要捕捉的函式設定為預設動作

②當呼叫fork時,子程序繼承父程序的訊號處理方式。因為子程序複製了父程序的儲存映像,所以訊號捕捉函式的位址在子程序中是有意義的。

不可靠訊號:早期的unix版本中,訊號是不可靠的。不可靠是指訊號可能會丟失

①早期版本存在的乙個問題是:在程序每次接到訊號對其進行處理時,隨即將該訊號動作復位為預設值

int sig_int( )

signal(sigint,sig_int);

sig_int()

//因為程序每次接到訊號進行處理時,隨即將該訊號動作復位為預設值。所以這裡用signal

函式重新註冊。但如果在用

signal

函式重新註冊前發生訊號,則會按預設進行處理

signal(sigint,sig_int);

②早期系統的另乙個問題是:在程序不希望某種訊號發生時,他不能關閉該訊號。程序能做的一確就是忽略該訊號。

int sig_int_flag;

main( )

int sig_int( );

signal(sigint,sig_int);

while(sig_int_flag==0)//用來忽略其他訊號而只等待sigint訊號

//如果在此處發生訊號,pause

就會長睡不醒。

pause();

sig_int( )

signal(sigint,sig_int);

sig_int_flag=1;

可被中斷的系統呼叫:程序在執行乙個低速系統呼叫而阻塞期間捕捉到乙個訊號,則該系統呼叫就被中斷不再繼續執行。該系統呼叫返回出錯,errno被置為eintr。與被中斷的系統呼叫相關的問題是必須顯式的

處理出錯返回

。為了幫助應用程式使其不必處理中斷的系統呼叫,4.2bsd引入了某些被中斷的系統呼叫的自動重啟動。

重啟動的例子:

again:

if((n=read(fd,buf,buffsize))<0)

if(errno==eintr)

goto again;

可重入函式:乙個可重入函式簡單來說就是可以被中斷的函式。為什麼會有不可重如函式存在:因為中斷的處理程式與可重入函式都要訪問某個臨界資源,而又沒有對臨界資源進行保護所以就容易發生問題。

訊號系統一些基本概念

截斷會使譜分析精度受到影響。如果時域訊號是週期性的,而截斷又按整週期取數,訊號截斷不會產生問題,因為每週期訊號都能代表整個週期訊號變化情況。若不是整週期擷取資料,則截斷將使訊號波形兩端產生突變,所擷取的一段訊號與原訊號有很大不同,對這個被截斷的時域訊號進行譜分析時,本來集中的線譜將分散在該線譜臨近的...

c 中的一些基本概念

tom archer寫的 c 技術內幕 通俗易懂,翻譯行文流暢,菜鳥如我也能順利地讀下去,不錯。覺得有些東西還是值得邊讀邊記的,留作以後參考。c 中的數值型別與引用型別 數值型別 數值型別類似c中的變數型別,當宣告乙個數值型別的時候,是在棧上分配相應的儲存空間,並且後續的操作都是直接針對這些已分配的...

Cas中的一些基本概念

ticket granting ticket tgt 可以認為是cas server根據使用者名稱密碼生成的一張票,存在server端.ticket granting cookie tgc 其實就是乙個cookie,存放使用者身份資訊,由server發給client端.service ticket ...