8.1.1 異常處理
處理會把一些處理器的狀態壓入棧中,返回時重新恢復在這些狀態;
當控制從使用者程式轉移到核心時,所有這些專案都會被壓入到核心的棧中,而不是使用者的棧;
異常處理程式執行在核心的模式下,這意味著對所有的系統資源有完全的訪問許可權;
8.1.2 異常的類別
異常可以為四種:中斷(interrupt)、陷阱(trap)、故障(fault)、終止(abort)
剩下的異常型別(陷阱、故障和終止)是同步發生的,是執行當前指令的結果。此類指令叫做故障指令(faulting instruction)。
8.2.1 邏輯控制流
8.2.2 併發流
8.2.3 私有位址空間
8.2.4 使用者模式和核心模式
8.2.5 上下文切換
發生上下文切換的情況:
if((pid = fork()) < 0)
但這樣使得**繁瑣,簡單一層包裝:
if((pid = fork()) < 0)
unix_error("fork error");
void unix_error(char * msg)
使用錯誤包裝處理函式:
pid_t fork(void)
return pid;
}
8.4.1 獲取程序狀態pid_t getpid(void); //獲取當前程序
pid_t getppid(void); //獲取父程序
8.4.2 建立和終止程序
程序的三種主要狀態:
建立程序:
pid_t fork(void);
子與父程序的同與不同:
fork()函式的特點:
8.4.3 **子程序
waitpid()函式:
pid_t waitpid(pid_t pid,int *status,int options);
引數options
檢查子程序退出狀態
wifsignaled(status) 如果子程序因為乙個未捕獲的訊號終止,返回真;
wifstopped(status)如果返回的子程序當前是被停止的,返回真
呼叫錯誤
wait函式
pid_t wait(int* status); //等價呼叫waitpid(-1,&status,0);
8.4.4 讓程序休眠unsigned
int sleep(unsigned
int secs);
int pause(void);
8.4.5 載入並執行程式int execve(const
char* filename,const
char argv,const
char *envp); //呼叫一次,成功不返回
在載入了filename之後,execve呼叫啟動**,啟動**設定棧,並將控制傳遞給新程式的主函式;
每種訊號型別都對應某種系統事件;底層的硬體異常,是由核心異常處理程式處理的;訊號提供了一種機制,通知使用者程序發生了這些異常;
8.5.1 訊號術語
接收訊號
乙個只要發出而沒有被接收的訊號,叫待處理訊號;
在任何時刻,一種型別,至多只有乙個待處理訊號,多餘的同型別訊號會被直接拋棄;
乙個程序可以有選擇的阻塞接收某種訊號,此訊號仍可被傳送,但待處理訊號不會被接收,直到程序取消對這種訊號的阻塞;
帶處理訊號最多只能被處理一次,核心為每個程序維護著待處理訊號的集合和被阻塞訊號的集合;當接收到乙個訊號時,在集合中標記,當接收時,消除;
8.5.2 傳送訊號
unix提供了多種向程序傳送程序的機制。這些機制是基於程序組的;
程序組
pid_t getpgrp(void);//獲得當前程序的程序組id
int setpgid(pid_t pid,pid_t pgid);
用/bin/kill程式傳送訊號
/bin/kill -9 15213 當-15213時,結束程序組號為15213的每乙個程序從鍵盤傳送訊號
用kill函式傳送訊號
int kill(pid_t pid,int sig);
用alarm函式傳送訊號
unsigned
int alarm(unsigned
int secs);
8.5.3 接收訊號
程序可以使用signal函式修改訊號的預設處理行為;
注意:sigstop和sigkill是不可忽略的的;
此函式有三種修改關聯方法:
當處理程式處理完時,控制通常會返回給下乙個指令;但在某些系統中,被中斷的系統掉用,會立即返回乙個錯誤;(下面將講述);
訊號處理程式的邏輯控制流與主函式的邏輯控制流重疊;
8.5.4 訊號處理問題
8.5.5 可移植訊號處理
8.5.6 顯示地阻塞和取消阻塞訊號
8.5.7同步流以避免討厭的併發錯誤
注意:setjump呼叫一次,返回多次
第8章 Python筆記 異常
一 按照自己的方式出錯 1 raise語句 raise語句可以引發異常 raise exception traceback most recent call last file line 1,in raise exception exception raise exception hyperdriv...
異常控制流
異常控制流 在作業系統執行程式時,作業系統會把程式具體到每條指令,利用程式指標順序執行指令以達到程式執行的目的。這些指令類似乙個集合,稱之為控制流。程式指標依次執行每條指令,稱之為控制轉移。但是在程式執行過程中因為種種原因,程式狀態發生變化,程式指標不會依次執行這些程式指令,引起程式狀態變化的是存在...
異常控制流
作業系統通過使控制流程發生突變來響應系統狀態變化,這些突變就是異常控制流 exceptional control flow,ecf 異常控制處理流程 1.系統啟動時,作業系統分配和初始化一張異常表,使得索引為k的條目對應異常號為k的處理程式的位址。2.系統執行時,處理器檢測到狀態變化,確定相應的異常...