訊號之函式的可重入性

2021-10-24 01:57:29 字數 1748 閱讀 4113

訊號之函式的可重入性

在呼叫某個函式過程**現中斷訊號,且改訊號處理函式中再次呼叫該函式,訪問全域性、靜態變數的函式是不可重入函式。

前後資料不一致,函式是不可重入的,特點:函式中使用全域性變數或靜態變數。

前後資料一致,函式是可重入的,特徵:函式中使用區域性變數。

root@spark# cat reinside.c

#include

#include

#include

#include

int g_v[10]

;int

*h_v;

void

set(

int n)

printf

("p_v:");

for(

int i =

0; i <

10; i++

)printf

("\n");

printf

("g_v:");

for(

int i =

0; i <

10; i++

)printf

("\n");

printf

("h_v:");

for(

int i =

0; i <

10; i++

)printf

("\n");

printf

("end running set....\n");

return;}

void

sig_hander

(int signo)

set(20)

;return;}

intmain

(void

) h_v =

(int*)

malloc

(sizeof

(int)*

10);if

(h_v ==

null

)printf

("begin running main....\n");

set(10)

;printf

("end running main....\n");

return0;

}

root@spark# ./reinside

begin running main…

begin running set…

^z19559 receive sigal sigtstp…

begin running set…

p_v:20 20 20 20 20 20 20 20 20 20

g_v:20 20 20 20 20 20 20 20 20 20

h_v:20 20 20 20 20 20 20 20 20 20

end running set…

p_v:10 10 10 10 10 10 10 10 10 10

g_v:20 20 20 20 20 10 10 10 10 10

h_v:20 20 20 20 20 10 10 10 10 10

end running set…

end running main…

root@spark#

執行5秒的時候按下ctrl+z, main函式中呼叫set函式中的全域性變數內容被改寫。

函式的可重入性

示例 可重入函式 int double int a 不可重入函式 void foo 對於函式中使用的某乙個變數,若兩次呼叫該函式時,這個變數都執行相同的結果,說明該函式是可重入的,否則是不可重入的。從經驗上來講就是 如果函式中使用了全域性變數或者靜態變數,則該函式是不可重入的,否則是可重入的。下面給...

函式的可重入性(Reentrancy)

什麼是可重入?可重入函式是乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。在寫函式時只要考慮到盡量用區域性變數 例如暫存器 堆疊中的變數 對於要使用的全域性變數要加以保護 例如採用關中斷 訊號量等 這樣構成的函式就一定是乙個可重入的函式。此外,編譯器是否有可重入函式的庫,與它所服務...

可重入函式 可重入核心

可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...