Linux程序操作 程序環境 全域性跳轉

2021-10-08 11:48:49 字數 1398 閱讀 1409

c語言程式中允許使用goto語句進行跳轉,但是這種跳轉只能存在於函式內部。linux環境下的全域性跳轉的實現思路是先設定乙個跳轉點,儲存當前的函式呼叫棧幀。當程式執行全域性調轉,回到該跳轉點時,使用儲存的棧幀覆蓋現有的棧幀,從而實現函式棧幀的還原。

c語言程式中允許使用goto語句進行跳轉,但是這種跳轉只能存在於函式內部,也就是說這種跳轉是區域性的。例如下面的鍊錶操作例項,**如下:

在這裡插入**片
linux使用setjmp和longjmp函式實現全域性跳轉,這種全域性跳轉的思想是:先設定乙個跳轉點,儲存當前的函式呼叫棧幀。當程式執行全域性調轉,回到該跳轉點時,使用儲存的棧幀覆蓋現有的棧幀,從而實現函式棧幀的還原。linux環境下使用jmp _buf結構儲存當前的棧幀,再跳轉時將該結構中儲存的棧幀還原即可。

#include

void

setjmp

(jmp_buf env)

;

引數說明:setjmp函式的引數為儲存當前棧幀的jmp. _buf 結構。在setjmp函式執行時,儲存當前的函式棧幀。在首席執行官跳轉後,函式棧幀被恢復,而恢復後的程式執行流程仍然停留在setjmp函式內部。因此setjmp函式的返回值有2種可能,即在設定跳轉點的時候返回和跳轉之後返回。這2種返回值是不同的。在第1種情況下,setjmp 函式返回0;在第2種情況下,setjmp 函式返回非零值。

#include

void

longjmp

(jmp_buf env,

int val)

;

引數說明:longjmp函式的第1個引數表示需要恢復的函式棧幀,該棧幀儲存在-乙個jmp__buf結構中。根據棧幀的不同,可以選擇不同的跳轉點。第2個引數表示跳轉之後setjmp函式的返回值。為了區別設定全域性跳轉點時的setjmp返回值,這個值應當設定為非零值。

注意:使用者可以根據setjmp的返回值判斷當前程式是否執行了全域性跳轉,下面例項演示了這種判斷。該程式定義了乙個函式,在其內部實現乙個從全域性跳轉。在呼叫函式之前main函式首先設定好跳轉點,主要任務是將當前main函式呼叫的棧幀儲存在-乙個jmp__buf結構

變數中。之後呼叫內部執行全域性調轉的函式f。

#include

#include

jmp_buf env;

voidf(

void

)int

main

(void

)

使用longjmp可以實現全域性跳轉進行出錯處理和資源釋放

linux 程序與程序環境

程序與程序環境 程序是執行中的程式,每個程序都執行在各自的虛擬位址空間中,某個程序的崩潰不會影響其它程序的執行。程序間的通訊 ipc 要通過系統核心 系統呼叫 來實現。程序分類 在linux系統中,根據程序的特點,程序可分為3大類 互動程序 批處理程序和守護程序。l 互動程序 由shell啟動的程序...

Linux程序環境

linux下c程式都是main開始的,main函式的原型是 int main int argc,char argv 其中argc是命令列引數的數目,argc是指向引數的各個指標所構成的陣列。c程式中有3個函式用於正常終止乙個程序,exit和 exit立即進入核心,exit則做一些清理工作後後進入核心...

Linux程序操作

檢視程序啟動時間 ps eo pid,lstart grep pid 檢視程序的執行多久 ps eo pid,etime grep pid 檢視程序中啟動了哪些執行緒 top h p pid d 0.3 檢視所有程序的pid號,該程序執行時傳入的命令列引數,分配的cpu ps eo pid,args...