《linux網路程式設計》 第三天 程序間通訊

2021-08-15 10:13:16 字數 2660 閱讀 1193

1.訊號

訊號可以中斷乙個程序,而不管它正在作什麼工作;

在linux 系統庫bits/signum.h 中對這些訊號名作了定義,每個名字代表乙個正整數;

系統呼叫不能被訊號打斷;

在linux 中,當乙個訊號的訊號處理函式執行時,如果程序又接收到了該訊號,該訊號會自動被儲存而不會中斷訊號處理函式的執行,直到訊號處理函式執行完畢再重新呼叫相應的處理函式;

但是如果在訊號處理函式執行時程序收到了其它型別的訊號,該函式的執行就會被中斷;

2.訊號型別

l sighup

當終止乙個終端時,核心就把這一種訊號傳送給該終端所控制的所有程序。通常情況下,乙個程序組的控制終端是該使用者擁有的終端,但不完全是如此。當程序組的首程序結束時,就會向該程序組的所有程序傳送這種訊號。這就可以保證當乙個使用者退出使用時,其後台程序被終止,除非有其它方面的安排。

l sigint

中斷鍵(一般為ctrl+c)

2 sigquit

ascii 碼fs,通常為ctrl+\

3 sigill

當乙個程序企圖執行一條非法指令時,核心就發出這種訊號。例如,在沒有相應硬體支撐的條件下,企圖執行一條浮點指令時,則會引起這種訊號的發生。sigill 和sigquit一樣,也形成非正常終止。

4 sigtrap

這是一種由除錯程式使用的專用訊號。由於他的專用行和特殊性,我們不再對它作進一步的討論。sigtrap 也形成非正常終止。

5 sigfpe

當產生浮點錯誤時(比如溢位),核心就發出這種訊號,它導致非正常終止。

6 sigkill

從乙個程序傳送到另乙個程序,使接收到該訊號的程序終止。核心偶爾也會發出這種訊號。sigkill 的特點是,它不能被忽略和捕捉,只能通過使用者定義的相應中斷處理程式而處理該訊號。因為其它的所有訊號都能被忽略和捕捉,所以只有這種訊號能絕對保證終止乙個程序。

7 sigalrm

當乙個定時器到時的時候,核心就向程序傳送這個訊號。定時器是由改程序自己用系統呼叫alarm()設定的。

8 sigterm

這種訊號是由系統提供給普通程式使用的,按照規定,它被用來終止乙個程序。

9 sigstop

這個訊號使程序暫時中止執行,系統將控制權轉回正在等待執行的下乙個程序。

l0 sigusr1 和sigusr2

和sigterm 一樣,這兩種訊號不是核心傳送的,可以用於使用者所希望的任何目的。

l1 sigchld

子程序結束訊號。unix 中用它來實現系統呼叫exit()和wait()。執行exit()時,就向子程序的父程序傳送sigchld 訊號,如果這時父程序政在執行wait(),則它被喚醒;

3.訊號處理

系統呼叫signal()用於接收乙個指定型別的訊號,並可以指定相應的方法。

系統庫signal.h 中的函式宣告如下:

int signal (int sig, __sighandler_t handler);

sig 指明了所要處理的訊號型別,它可以取除了sigkill 和sigstop 外的任何一種訊號。

引數handler 描述了與訊號關聯的動作,它可以取以下三種值:

1.乙個返回值為整數的函式位址。

此函式必須在signal()被呼叫前宣告,handler 中為這個函式的名字。當接收到乙個型別為sig 的訊號時,就執行handler 所指定的函式。這個函式應有如下形式的定義:

int func(int sig);

sig 是傳遞給它的唯一引數。執行了signal()呼叫後,程序只要接收到型別為sig 的訊號,不管其正在執行程式的哪一部分,就立即執行func()函式。當func()函式執行結束後,控制權返回程序被中斷的那一點繼續執行。

2. sig_ign

這個符號表示忽略訊號。執行了相應的signal()呼叫好,程序會忽略型別為sig 的訊號。

3. sig_dfl

這個符號表示恢復系統對訊號的預設處理。

4. 在程序間傳送訊號

kill()在linux 系統庫signal.h中的函式宣告如下:

int kill(pid_t pid, int sig);

引數pid 指定了訊號傳送的物件程序:它可以是某個程序的程序識別符號(pid),也可以是以下的值:

如果pid 為零,則訊號被傳送到當前程序所在的程序組的所有程序;

如果pid 為-1,則訊號按程序識別符號從高到低的順序傳送給全部的程序(這個過程受到當前程序本身許可權的限制,請看後面的解釋);

如果pid 小於-1,則訊號被傳送給識別符號為pid 絕對值的程序組裡的所有程序。

普通使用者的程序只能向具有與其相同的使用者識別符號的程序傳送訊號。

只有root 使用者的程序能夠給任何執行緒傳送訊號。

5.alarm函式

函式庫unistd.h 中的函式

unsigned int alarm(unsigned int seconds);

引數是以秒為單位給出了定時器的時間。當時間到達的時候,就向系統傳送乙個sigarlm 訊號。

它能立即返回,並使程序繼續執行行,直至指定的延遲時間到達發出sigalrm訊號;

在fork()呼叫後中,在子程序中失效;

如果要使設定的報警時鐘失效,只需要呼叫:alarm(0);

學習Linux第三天

1 while語句 while語句的一般形式 while 表示式 語句 其中,表示式是迴圈條件,語句為迴圈體。1 while語句中的表示式一般是關係表示式或邏輯表示式,只要表示式的值為真 非0 即可繼續迴圈。2 迴圈體若包括乙個以上的語句,則必須用 括起來,組成復合語句。如果忽略了花括號的用途,語句...

linux學習第三天

一 檔案重定向 linux中認為一切皆為檔案 檔案描述符 標準輸入 從鍵盤獲取資料 0 標準輸出 在螢幕上顯示正確資料 1 標準錯誤 在螢幕上顯示錯誤的資料 2 1 使用 進行檔案重定向 history a 把history的內容放在a檔案中 命令 檔案描述符 檔案 注意 會先把右側的檔案清空在寫入...

Linux學習第三天

1.who 命令,顯示當前的登入使用者都有誰 2.last 命令,顯示歷史登入資訊 3.uname a 顯示作業系統資訊 4.uptime 顯示系統負載情況 cat etc redhat release 檢視系統資訊 5.history 檢視歷史執行過的命令 6.history裡的數字,可以直接執行...