標籤:
11.4.2 訊號集標頭檔signal.h定義了類型sigset_t和用來處理訊號集的函數.sigaction和其他函數.sigaction和其他函數將用這些訊號集來修改進程在接收到訊號時的行為.
#include <signal.h>
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 <signal.h>
int sigismember(sigset_t *set, int signo);
進程的訊號屏蔽字的設定或檢查工作由函數sigprocmask來完成.訊號屏蔽字是指當前被阻塞的一組訊號,它們不能被當前進程接收到.
#include <signal.h>
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 進程之間可以用這個訊號進行通訊,例如讓進程報告狀態資訊等
11.5 小結本章中,知道了進程是如何成為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程式設計——進程和訊號總結(第十一章)