Head First C 學習日誌 第十章 進程間通訊 捕捉信號

Head First C 第十章 進程間通訊 捕捉信號

關於信號

信號是操做系統控制程序的方式,舉個栗子,操做系統在看到用戶輸入了Ctrl+C時,就會向程序發送中斷信號。 信號映射表git

信號 處理函數
SIGURG 不作事情
SIGINT 調用exit()

捕捉信號而後運行本身的代碼

有時候你但願別人打斷你的程序時運行本身的代碼。假設進程打開了一些文件或網絡鏈接,你但願在退出以前把它們關閉,而且作一些清理工做。在這裏引入sigaction結構。 sigaction是一個函數包裝器 sigaction是一個結構體,它有一個函數指針,siagction告訴操做系統進程收到某個信號時該調用哪一個函數github

sigaction的建立方法以下
struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flag = 0;

sigemptyset用於設置信號,在信號被使用前必須調用sigemptysetsigfillsetsigemptyset在man中的函數原型和解釋是:網絡

int sigemptyset(sigset_t *set);

The sigemptyset() function initializes a signal set to be empty.函數

將信號初始化設置爲空。 處理器必須接收信號參數 信號是一個整型值,若是你建立了一個自定義處理函數,就須要接收一個整型參數:操作系統

void diediedie(int sig) {
	  puts("Goodbye cruel world...\n");
	  exit(1);
	}
用sigaction()註冊sigaction

建立sigaction之後,須要用sigaction()函數註冊,使操做系統知道它的存在。指針

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

sigaction()函數接收3個參數,信號,動做,舊動做(能夠傳NULL)。rest

將建立和初始化封裝成一個函數
int catch_signal(int sig, void (*handler)(int)) {
	struct sigaction action;
	action.sa_handler = handler;
	sigemptyset(&action.sa_mask);
	action.sa_flags = 0;
	return sigaction(sig, &action, NULL);
}

這樣只要把信號和處理器傳給catch_signal()函數,就能夠設置信號處理器了。code

給進程發送信號

用kill命令發送信號

運行程序後,可使用Ctrl+C發送一箇中斷信號,若是想發送其餘信號,能夠用在終端下用kill命令,格式爲kill -信號 進程號 kill -INT 1739的效果和Ctrl+C同樣,都是發送中斷信號。進程

在進程內發送信號

在進程內可使用raise()函數向本身發送信號。 一般會在自定義的信號處理器中使用raise(),這樣程序就能在接收到低級別的信號時引起更高級別的信號,這叫作信號升級get

例程代碼

signal handler sample

相關文章
相關標籤/搜索