《UNIX環境高階程式設計(第3版)》 1 9 訊號

2021-09-23 14:56:31 字數 1137 閱讀 1106

訊號(signal)用於通知程序發生了某種情況。例如,若某一程序執行除法操作,其除數為0,則將名為sigfpe(浮點異常)的訊號傳送給該程序。程序有以下3種處理訊號的方式。

(2)按系統預設方式處理。對於除數為0,系統預設方式是終止該程序。

(3)提供乙個函式,訊號發生時呼叫該函式,這被稱為捕捉該訊號。通過提供自編的函式,我們就能知道什麼時候產生了訊號,並按期望的方式處理它。

很多情況都會產生訊號。終端鍵盤上有兩種產生訊號的方法,分別稱為中斷鍵(interrupt key,通常是delete鍵或ctrl+c)和退出鍵(quit key,通常是ctrl+),它們被用於中斷當前執行的程序。另一種產生訊號的方法是呼叫kill函式。在乙個程序中呼叫此函式就可向另乙個程序傳送乙個訊號。當然這樣做也有些限制:當向乙個程序傳送訊號時,我們必須是那個程序的所有者或者是超級使用者。

例項回憶一下基本的shell例項(見圖1-7程式)。如果呼叫此程式,然後按下中斷鍵,則執行此程式的程序終止。產生這種後果的原因是:對於此訊號(sigint)的系統預設動作是終止程序。該程序沒有告訴系統核心應該如何處理此訊號,所以系統按預設方式終止該程序。

為了能捕捉到此訊號,程式需要呼叫signal函式,其中指定了當產生sigint訊號時要呼叫的函式的名字。函式名為sig_int,當其被呼叫時,只是列印一條訊息,然後列印乙個新提示符。在圖1-7程式中新增了11行,構成了圖1-10程式(新增的11行以行首的+號指示)。

#include "apue.h"

#include + static void sig_int(int);  /* our signal-catching function */

+  int

main(void)

else if (pid == 0)

/* parent */

if ((pid = waitpid(pid, &status, 0)) < 0)

err_sys("waitpid error");

printf("%% ");

}exit(0);

}+ + void

+ sig_int(int signo)

+

圖1-10 從標準輸入讀命令並執行

因為大多數重要的應用程式都對訊號進行處理,所以第10章將詳細介紹訊號。

UNIX環境高階程式設計 第2版 pdf格式

unix環境高階程式設計 第2版 本書描述unix系統的程式設計介面 系統呼叫介面和標準c庫提供的很多函式。本 書針對的是所有的程式設計師。與大多數作業系統一樣,unix為程式執行提供了大量的服務 開啟檔案,讀檔案,啟 動乙個新程式,分配儲存區以廈獲得當前時間等。這些服務被稱為系統呼叫介面 syst...

Unix環境高階程式設計 2版

1.簡單實現 ls include opendir readdir closedir 2.將標準輸入複製到標準輸出 include n read stdin fileno,buf,4096 write stdout fileno,buf,n 3.執行時限制 include long sysconf ...

unix環境高階程式設計

unix 日曆時間 自1970 年1 月1 日00 00 00 以來的國際標準時間 utc 程序時間 cpu 時間 時鐘時間 程序執行時間的總量。使用者cpu 時間 執行使用者指令時間量。系統cpu 時間 執行核心所經歷時間。命令 time 第三章至第七章 原子操作 任何乙個要求多於1 個函式呼叫的...