為了增強程式的穩定性,在訊號處理函式中應使用可重入函式。
訊號處理程式中應當使用可再入(可重入)函式(注:所謂可重入函式是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯)。因為程序在收到訊號後,就將跳轉到訊號處理函式去接著執行。如果訊號處理函式中使用了不可重入函式,那麼訊號處理函式可能會修改原來程序中不應該被修改的資料,這樣程序從訊號處理函式中返回接著執行時,可能會出現不可預料的後果。不可再入函式在訊號處理函式中被視為不安全函式。
可重入函式(即可以被中斷的函式)可以被乙個以上的任務呼叫,而不擔心資料破壞。可重入函式在任何時候都可以被中斷,而一段時間之後又可以恢復執行,而相應的資料不會破壞或者丟失。
可重入函式使用的變數有兩種情況:
1.使用區域性變數,變數儲存在cpu暫存器中或者堆疊中;
2.使用全域性變數,但是這時候要注意保護全域性變數(防止任務中斷後被其它任務改變變數)。
void
strcpy
(*dest,*src)
{
while
(* dest++ = *src ++)
*dest = nul;
}
分析:上面的函式用於字串複製,而引數是存放在堆疊中的,故而改函式可以被多工呼叫,而不必擔心各個任務呼叫期間會互相破壞對方的指標。
基本上下面的函式都是不可重入的:
1.函式內使用了靜態的資料。
2.函式內使用了malloc()或者free()函式的。
3.函式內呼叫了標準的i/o函式的。
4.進行了浮點運算.
int
temp;
void
swap(
int
*ex1,
int
*ex2)
{
temp = *ex1;
//(1)
*ex1 = *ex2;
*ex2 = temp;
}
分析:該函式中的全域性變數temp是的函式變成了乙個不可重入的函式,因為在多工系統中,假如在任務1中呼叫swap函式,而程式執行到(1)處時被中斷,進而執行其它的任務2,而剛好任務2也呼叫了swap函式,則temp裡存的值則會被任務2改變。從而回到任務1被中斷處繼續執行的時候,temp裡存的值已經不再是原來存的temp值了,進而產生了錯誤。
常用的可重入函式的方法有:
1.不要使用全域性變數,防止別的**覆蓋這些變數的值。
2.呼叫這類函式之前先關掉中斷,呼叫完之後馬上開啟中斷。防止函式執行期間被中斷進入別的任務執行。
3.使用訊號量(互斥條件)。
總之:要保證中斷是安全的
可重入函式 可重入核心
可重入函式這一概念早有接觸,但一直未有系統的理解,最近閱讀 apue 訊號一章時,其中講解很到位,故總結如下。訊號作為一種軟中斷,能夠被程序給捕獲,因而也就中斷程序的正常執行,轉而去執行訊號處理程式,最後再返回到原程序繼續正常執行。然而,當程序正在執行 malloc 動態記憶體分配時,訊號產生從而轉...
可重入核心 可重入函式
可重入核心在ulk 深入理解linux核心 中的定義是指若干個程序可以同時在核心態下執行,也就是說多個程序可以在核心態下併發執行核心 在單處理器上,只能實現 微觀上的序列,巨集觀上的並行,即任意時刻,只有乙個進 正執行,其他程序處於阻塞或者等待狀態。這裡的可重入,是指可以多個程序進入核心,並不是重複...
可重入函式
在實時系統的設計中,經常會出現多個任務呼叫同乙個函式的情況。如果這個函式不幸被設計成為不可重入的函式的話,那麼不同任務呼叫這個函式時可能修改其他任務呼叫這個函式的資料,從而導致不可預料的後果。那麼什麼是可重入函式呢?所謂可重入函式是指乙個可以被多個任務呼叫的過程,任務在呼叫時不必擔心資料是否會出錯。...