訊號
訊號是軟體中斷。很多⽐較重要的應⽤程式都需處理訊號。訊號提供了⼀種處理非同步事件的⽅法。每個訊號都有⼀個名字。這些名字都以三個字元sig開頭。
在linux系統中可以使用kill -l命令來檢視系統支援的訊號。
1) 程序呼叫kill函式或使用kill命令傳送訊號給其他程序。
2) 系統核心異常產生的中斷。如硬體損壞等等。
1) 忽略訊號。但是有兩種訊號是不能被忽略。這兩種訊號分別是sigkill和sigstop。不能忽略的原因是這是程序向超級⽤戶提供⼀種使程序終⽌或停⽌的可靠⽅法。
2) 捕捉訊號。可以通知核心發生該訊號時呼叫乙個使用者自定義的函式。
3) 執行系統預設操作。
#include#include#include#includestatic void sig_usr(int); /* one handler for both signals */
int main(void)
if (signal(sigstop, sig_usr) ==sig_err)
for ( ; ; )
pause();
}static void sig_usr(intsigno) /* argument is signalnumber */
從該測試程式可以看出來,sigkill和sigstop訊號不能被忽略。從上面的例子可以看出來,signal函式不改變訊號的處理方式就不能確定訊號當前的訊號處理方式。訊號沒呼叫signal函式來設定處理函式,當發生該訊號時就會使用預設的處理方式來處理。
#include #include #include #include static void sig_usr(int); /* one handler for both signals */
int main(void)
pid_tpid = fork();
if(pid<0)elseif(pid ==0)else
for( ; ; )
pause();
}static void sig_usr(int signo) /* argument is signal number */
測試結果:
我們首先檢視程序的關係,使用ps 命令來檢視父子程序的程序id。如下所示:
[root@localhost signals]# ps -ef | grep sig
root 3262 2748 0 10:54 pts/0 00:00:00 ./sigusr
root 3263 3262 0 10:54 pts/0 00:00:00 ./sigusr
可以看出子程序的id為3263,當我們使用 kill -usr1 3263在終端傳送命令時,可以看到子程序收到了訊號並執行了訊號處理函式,並且該訊號處理函式是從父程序繼承過來的。
[root@localhost signals]# ./sigusr
parents
child
3263,received sigusr1
1、sigkill和sigstop訊號不能被忽略。
2、signal函式不改變訊號的處理方式就不能確定訊號當前的訊號處理方式。
3、子程序可以從父程序處繼承訊號處理方式。
學習那點事
這一周快過去了,回顧這一周,學到的,講到的東西,都很多,其實作為一名程式設計師,是不應該怕累的,雖然很累,學無止境,每天都要更新自己的知識,才能成為一名合格的程式設計師。我一直很想成為一名優秀的程式設計師,從剛開始的無知,經過很盲目,到現在明白了自己要學的是什麼,要怎樣學,這是乙個很艱難的過程,自己...
選舉那點事
選舉那點事 選舉前,大家都互相的打招呼,拉選票。可是我當時覺得好孤獨,好寂寞。當我看到大家在一起熱鬧的打招呼時,真的是忍受不了這種氛圍,偷偷的溜出去,暗自哭泣。我想知道這是不是以自我為中心,不願意走出去,將自己封閉了。我還想知道就那麼20票,當每個人都給你說要投他一票時,自己該怎麼說。老師說要的是鍛...
剝削那點事
鐵上無聊忽然想起了這個問題,竟然還想到了乙個答案。我想用乙個模糊點的稱呼 資本,我得出這樣乙個結論,所謂剝削不過是資本在社會博弈過程中所得到的分紅。資本在整個社會博弈中所面臨的對手包括管理機關,勞動者 和同業競爭者,其中管理機關也身擔裁判這個身份,這個紅利主要在勞動者身上取得,但是同時也和其他對手綜...