linux程式設計 程序和訊號總結(第十一章)

2021-07-03 14:59:43 字數 3067 閱讀 9089

11.4.2    訊號集 標頭檔案signal.h定義了型別sigset_t和用來處理訊號集的函式.sigaction和其他函式.sigaction和其他函式將用這些訊號集來修改程序在接收到訊號時的行為.

#include int sigaddset(sigset_t *set, int signo);

int sigemptyset(sigset_t *set);

int sigfillset(sigset_t *set);

int sigdelset(sigset_t *set, int signo);

這些函式執行的操作如它們的名字所示,sigemptyset將訊號集初始化為空.sigfillset將訊號集初始化為包含所有已定義的訊號.sigaddset和sigdelset從訊號集中增加或刪除給定的訊號(signo).它們在成功時返回0,失敗時返回-1並設定errno.

函式sigismember判斷乙個給定的訊號是否是乙個訊號集的成員.如果是就返回1;如果不是就返回0;給定訊號無效就返回-1並設定errno為einval.

#include int sigismember(sigset_t *set, int signo);
程序的訊號遮蔽字的設定或檢查工作由函式sigprocmask來完成.訊號遮蔽字是指當前被阻塞的一組訊號,它們不能被當前程序接收到.

#include int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
sigprocmask函式可以根據引數how指定的方法修改程序的訊號遮蔽字,新的訊號遮蔽字由引數set指定,而原先的訊號遮蔽字將儲存在訊號集oset中.

常用訊號參考

下表中訊號的預設動作都是異常終止程序,程序將以_exit呼叫方式退出(它類似exit,但在返回到核心之前不作任何清理工作).但程序的結束狀態會傳遞到wait和waitpid函式中,從而表明程序是因某個特定的訊號而異常終止的.

訊號名稱                  說明

sigalrm                由alarm函式設定的定時器產生

sighu                     由乙個處於非連線狀態的終端傳送給控制程序

sigint                     一般由從終端輸入的ctrl+c組合鍵或預先設定好的中斷字元產生

sigkill                   因為這個訊號不能**獲,一般在shell中用它來強制終止異常程序

sigpipe                   如果在向管道寫資料時沒有與之對應的讀程序,就會產生這個訊號

sigterm                作為乙個請求被傳送,要求程序結束執行

sigusr1,sigusr2        程序之間可以用這個訊號進行通訊,例如讓程序報告狀態資訊等

本章中,知道了程序是如何成為linux系統的乙個基本組成部分的.學習了如何啟動程序,終止程序和檢視程序,如何用它們來解決程式設計問題.還介紹了訊號這種可以用來控制程式執行行為的事件.還了解了所有的linux程序,包括init在內,都使用這同樣的系統呼叫,每個程式設計師都可以也用它們來開發自己的程式.

1.程序是如何成為linux系統的乙個基本組成部分?

程序是"乙個其中執行著乙個或多個執行緒的位址空間和這些執行緒所需要的系統資源".每個執行著的程式例項就構成了乙個程序.

正在執行的程式或程序由程式**,資料,變數(占用著系統記憶體),開啟的檔案(檔案描述符)和環境組成.

每個程序都被分配乙個唯一的數字編號--程序識別符號或pid.

2.如何啟動程序,終止程序和檢視程序?

使用ps命令檢視執行的程序(-a選項檢視所有的程序,-f顯示程序的完整資訊)

使用system(const char* string)(例如system("ps ax"))在程式的內部啟動另乙個程式,從而建立乙個新程序.

使用system函式啟動程序的缺點是,它必須用乙個shell來啟動所需要的程序(必須安裝shell)

使用exec系列函式把當前程序替換為乙個新程序(原來的程式就不再執行)

呼叫fork建立乙個新的程序,這個系統呼叫複製當前程序,在程序表中建立乙個新的表項,新程序幾乎與原程序相同,但新程序有自己的資料空間,環境和檔案描述符.子程序的fork呼叫返回的是0,通過這點可以判斷出誰是父程序,誰是子程序.

呼叫wait函式讓父程序等待子程序的結束,呼叫waitpid函式等待某個特定的程序的結束.

3.訊號

訊號是linux系統響應某些條件而產生的乙個事件,接收到該訊號的程序會相應地採取一些行動.訊號是由於某些錯誤條件產生的,如記憶體段衝突,浮點處理器或非法指令等,它們由shell和終端處理器生成來引起中斷,它們還可以作為在程序間傳遞訊息或修改行為的一種方式,明確地由乙個程序傳送給另乙個程序.

可以使用signal函式處理訊號

void (*signal(int sig, void(*func)(int)))(int);
signal是乙個指標函式

signal有兩個引數:int和某某指標,某某指標是乙個函式指標,指向乙個引數為int,返回值為void的函式

signal的返回值是:指標,這個指標是乙個函式指標,指向乙個引數為int,返回值為void的函式

sig給出準備捕獲或忽略的訊號,func給出接收到指定的訊號後將要呼叫的函式

健壯的訊號介面使用sigaction(不使用signal),它的定義如下:

int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

sigaction是乙個結構,至少包括以下幾個成員:

void (*) (int) sa_handler    /* sa_handler是乙個函式指標,它指向接收到訊號sig時將要被呼叫的訊號處理函式 */

sigset_t sa_mask /* sa_mask成員指定了乙個訊號集 */

int sa_flags /* signal action modifiers */

Linux程式設計 程序和訊號

程序的結構 型別和排程 可以把程序看做是正在執行的程式。程序結構 程序識別符號 檔案描述符 棧空間和環境變數 程式計數器 作業系統通過程序的 pid對它們進行管理,pid是程序表的索引。linux 排程器根據 程序的優先順序 來決定呼叫哪個程序。用不同的方法啟動新程序 system 函式作用 執行以...

Linux程式設計 程序 訊號

半年不接觸linux,有些東西變的太陌生了,再回顧一下我的linux 基礎 程式設計吧 程序 1.得到程序資訊的常用函式 include include pid t getpid void 程序id pid t getppid void 父程序id uid t getuid void 程序所有者的i...

Linux 程序和訊號

1.程序識別符號 pid 的取值範圍從2到32768,數字1是為特殊程序init保留的,init程序負責管理其他程序。2.linux程序表就像乙個資料結構,它把當前載入在記憶體中的所有程序的相關資訊儲存在乙個表中,pid是程序表的索引。3.ps af tty一列顯示了程序是從哪乙個終端啟動的。cmd...