日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux系统编程】可重入和不可重入函数

發布時間:2024/4/24 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux系统编程】可重入和不可重入函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 不可重入函數
    • 02. 可重入函數
    • 03. 判斷條件
    • 04. Linux常用可重入函數
    • 05. 附錄

01. 不可重入函數

在實時系統的設計中,經常會出現多個任務調用同一個函數的情況。如果有一個函數不幸被設計成為這樣:那么不同任務調用這個函數時可能修改其他任務調用這個函數的數據,從而導致不可預料的后果。這樣的函數是不安全的函數,也叫不可重入函數

02. 可重入函數

肯定有一個安全的函數,這個安全的函數又叫可重入函數。那么什么是可重入函數呢?所謂可重入是指一個可以被多個任務調用的過程,任務在調用時不必擔心數據是否會出錯。

一個可重入的函數簡單來說就是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入OS調度下去執行另外一段代碼,而返回控制時不會出現什么錯誤;而不可重入的函數由于使用了一些系統資源,比如全局變量區,中斷向量表等,所以它如果被中斷的話,可能會出現問題,這類函數是不能運行在多任務環境下的。

也可以這樣理解,重入即表示重復進入,首先它意味著這個函數可以被中斷,其次意味著它除了使用自己棧上的變量以外不依賴于任何環境(包括 static),這樣的函數就是purecode(純代碼)可重入,可以允許有該函數的多個副本在運行,由于它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問全局變量(包括 static),一定要注意實施互斥手段。可重入函數在并行運行環境中非常重要,但是一般要為訪問全局變量付出一些性能代價。

編寫可重入函數時,若使用全局變量,則應通過關中斷、信號量(即P、V操作)等手段對其加以保護。

說明:若對所使用的全局變量不加以保護,則此函數就不具有可重入性,即當多個進程調用此函數時,很有可能使有關全局變量變為不可知狀態。

示例:假設 Exam 是 int 型全局變量,函數 Squre_Exam 返回 Exam 平方值。那么如下函數不具有可重入性。

int Exam = 0; unsigned int example( int para ) { unsigned int temp;Exam = para; // (**)temp = Square_Exam( );return temp; }

此函數若被多個進程調用的話,其結果可能是未知的,因為當(**)語句剛執行完后,另外一個使用本函數的進程可能正好被激活,那么當新激活的進程執行到此函數時,將使 Exam 賦與另一個不同的 para 值,所以當控制重新回到 “temp = Square_Exam( )” 后,計算出的temp很可能不是預想中的結果。此函數應如下改進。

int Exam = 0; unsigned int example( int para ) {unsigned int temp;[申請信號量操作] //(1) 加鎖Exam = para;temp = Square_Exam( );[釋放信號量操作] // 解鎖 return temp; }

申請不到“信號量”,說明另外的進程正處于給 Exam 賦值并計算其平方過程中(即正在使用此信號),本進程必須等待其釋放信號后,才可繼續執行。若申請到信號,則可繼續執行,但其它進程必須等待本進程釋放信號量后,才能再使用本信號。

03. 判斷條件

保證函數的可重入性的方法:

1)在寫函數時候盡量使用局部變量(例如寄存器、堆棧中的變量);

2)對于要使用的全局變量要加以保護(如采取關中斷、信號量等互斥方法),這樣構成的函數就一定是一個可重入的函數。

滿足下列條件的函數多數是不可重入(不安全)的:

1)函數體內使用了靜態的數據結構;

2)函數體內調用了malloc() 或者 free() 函數;

3)函數體內調用了標準 I/O 函數。

如何將一個不可重入的函數改寫成可重入函數呢?把一個不可重入函數變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那么寫出來的函數就是可重入的:

1)不要使用全局變量。因為別的代碼很可能改變這些變量值。
2)在和硬件發生交互的時候,切記執行類似 disinterrupt() 之類的操作,就是關閉硬件中斷。完成交互記得打開中斷,在有些系列上,這叫做“進入/ 退出核心”。
3)不能調用其它任何不可重入的函數。
4)謹慎使用堆棧。

04. Linux常用可重入函數

05. 附錄

5.1 參考:可重入函數與不可重入函數分析

總結

以上是生活随笔為你收集整理的【Linux系统编程】可重入和不可重入函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人无码精品久久久电影 | 又大又粗弄得我出好多水 | 久久六| 黄金网站在线观看 | 免费观看一区二区三区 | 国产高清在线 | 青青免费视频 | 国产精品一区网站 | 成人写真福利网 | 国产女人水真多18毛片18精品 | caoporm超碰 | 亚洲高清精品视频 | 欧美大黑b | 国产又黄又猛又粗 | 欧美一二三区 | 影音先锋国产资源 | 久久一区二 | 欧美亚洲福利 | 亚洲av无码专区在线 | 欧美日韩综合在线 | 久久免费视频播放 | 色一情一交一乱一区二区三区 | 欧美男优| 亚洲美免无码中文字幕在线 | 亚洲欧美日韩视频一区 | 无码人妻丰满熟妇精品 | 色呦呦网站在线观看 | 免费在线观看日韩av | 久久视频在线免费观看 | 中文在线第一页 | 久久精品亚洲一区 | 啪啪小视频 | 日韩激情久久 | 超碰日日夜夜 | 成人黄色小说视频 | 久青草影院| 日韩操操操 | 精品在线视频一区二区 | 天天爽天天射 | 国产精品久久久久毛片 | 亚洲图片欧美激情 | 中国女人毛片 | 三级全黄视频 | 中文字幕日韩精品一区 | 麻豆一区二区在线观看 | 亚洲av无码精品一区二区 | 香蕉视频影院 | 国产高清精品一区二区三区 | 一级黄色片毛片 | 久久久三级 | 天海翼av在线 | 亚洲福利影院 | 精久久久| 午夜毛片在线 | 国产精品人 | 亚洲免费在线观看 | 欧美在线免费观看视频 | 亚洲激情图片 | 婷婷成人av | 美日韩视频 | 国产精品久久久久久久久久久久久 | 欧美福利片在线观看 | 国产不卡在线观看视频 | 枫花恋在线观看 | 欧美成人手机在线视频 | 性激烈视频在线观看 | 国产精品一区二区三区四区在线观看 | 国产99久久九九精品无码 | 嫩草影院懂你的 | 国产女主播在线一区二区 | 欧美成人91 | 欧美日韩亚洲国产精品 | 91国内精品野花午夜精品 | 亚洲呦呦 | 久久久不卡国产精品一区二区 | 天天爽 | 美日韩毛片| 久久久国产精品黄毛片 | 成年人看片网站 | 中文字幕av一区二区三区人妻少妇 | 韩国一区二区三区在线观看 | 亚洲激情成人网 | 免费的黄色的视频 | 99精品欧美一区二区 | 日韩精品首页 | 乳揉みま痴汉4在线播放 | 五月婷婷在线观看 | 孕妇爱爱视频 | av久热 | 日韩精品久久久 | 青青草原在线免费观看视频 | 国产又黄又硬又粗 | 免费在线观看日韩 | 精品深夜av无码一区二区老年 | 亚洲激情五月婷婷 | 嫩草视频免费观看 | 久草免费在线色站 | 久久艹久久 | 五月激情六月婷婷 |