訊號之函式的可重入性
在呼叫某個函式過程**現中斷訊號,且改訊號處理函式中再次呼叫該函式,訪問全域性、靜態變數的函式是不可重入函式。
前後資料不一致,函式是不可重入的,特點:函式中使用全域性變數或靜態變數。
前後資料一致,函式是可重入的,特徵:函式中使用區域性變數。
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 動態記憶體分配時,訊號產生從而轉...