第8章 異常控制流

2021-08-02 10:20:41 字數 2953 閱讀 7655

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.系統執行時,處理器檢測到狀態變化,確定相應的異常...