⑴ 為什麼在linux中中斷服務程序中不能調用可能阻塞的函數
任何操作系統,在中斷服務函數中,都不能阻塞,另外中斷服務函數還應該越短越好,主要原因是:
1、 中斷服務函數的執行和一般進程執行某個函數時的上下文環境 (context) 是不一樣的,是在一個特定的context中,這個環境不許阻塞,否則系統異常。
2、 中斷服務函數過長甚至阻塞,會嚴重影響整個系統運行效率甚至掛死 (想想看,系統無時無刻不在產生各種各樣中斷,操作系統本身的運行也依靠某些精確發生的中斷,比如定時器靠時鍾中斷等,如果某個中斷處理函數執行了很長時間 【阻塞可以理解成導致函數執行了無限長的時間】,整個系統就無法正常工作了)
⑵ linux怎麼查看線程阻塞原因
linux查看線程阻塞原因:pthread_join一般主線程來調用,用來等待子線程退出,因為是等待,所以是阻塞的,一般主線程會依次join所有它創建的子線程。
1)執行top命令,或使用-H選項(顯示所有線程),找到相關的高CPU的PID。
2)生成thread mp 快照(kill -3 PID)。
3)將top命令輸出PID轉換為HEX格式(16進制)。
4)在thread mp data中搜索nid=<Hex PID>。
5)分析受影響的thread和stack trace,精確定位代碼。
特點:
Linux,全稱GNU/Linux,是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX的多用戶、多任務、支持多線程和多CPU的操作系統。伴隨著互聯網的發展,Linux得到了來自全世界軟體愛好者、組織、公司的支持。
它除了在伺服器方面保持著強勁的發展勢頭以外,在個人電腦、嵌入式系統上都有著長足的進步。使用者不僅可以直觀地獲取該操作系統的實現機制,而且可以根據自身的需要來修改完善Linux,使其最大化地適應用戶的需要。
Linux不僅系統性能穩定,而且是開源軟體。其核心防火牆組件性能高效、配置簡單,保證了系統的安全。在很多企業網路中,為了追求速度和安全,Linux不僅僅是被網路運維人員當作伺服器使用,甚至當作網路防火牆,這是Linux的一大亮點。
Linux具有開放源碼、沒有版權、技術社區用戶多等特點,開放源碼使得用戶可以自由裁剪,靈活性高,功能強大,成本低。尤其系統中內嵌網路協議棧,經過適當的配置就可實現路由器的功能。這些特點使得Linux成為開發路由交換設備的理想開發平台。
⑶ linux闃誨炰笌闈為樆濉瀕inux闃誨為潪闃誨
鍦ㄩ潪闃誨炴ā寮忎笂鎬庝箞鐭ラ亾recv鎺ユ敹鏁版嵁瀹屾垚錛
浠linux涓媡cpsocket緙栫▼涓轟緥錛氶樆濉炲氨鏄痳ecv/read鐨勬椂鍊檚ocket鎺ユ敹緙撳啿鍖鴻佹槸鏈夋暟鎹灝辮伙紝娌℃暟鎹鎴戝氨涓鐩寸潯瑙夎禆鐫涓嶈蛋錛岀洿鍒版湁鏁版嵁鏉ヤ簡璇誨畬鎴戞墠璧般
send/write鐨勬椂鍊欙紝瑕佹槸鍙戦佺紦鍐插尯婊′簡錛屾病鏈夌┖闂寸戶緇鍙戦佷簡鎴戜篃涓鐩寸潯瑙夎禆鐫涓嶈蛋錛岀洿鍒板彂閫佺紦鍐插尯鑵懼嚭瓚沖熺殑絀洪棿璁╂垜鎶婃暟鎹鍏ㄩ儴濉炲埌鍙戦佺紦鍐插尯閲屾垜鎵嶈蛋銆
錛堝綋鐒跺傛灉浣犻氳繃setsockopt璁劇疆浜嗚誨啓瓚呮椂錛岃秴鏃舵椂闂村埌浜嗚繕鏄浼氳繑鍥-1鍜孍AGAIN錛屼笉鍐嶇潯瑙夌瓑寰咃級
闈為樆濉炲氨鏄痳ecv/read鐨勬椂鍊欙紝瑕佹槸鎺ユ敹緙撳啿鍖烘湁鏁版嵁鎴戝氨璇誨畬錛屾病鏈夋暟鎹鎴戠洿鎺ュ甫鐫榪斿洖鐨-1鍜孍GAIN璧頒漢錛岀粷涓嶇潯瑙夌瓑寰呰借鏃墮棿銆
write/send鐨勬椂鍊欙紝瑕佹槸鍙戦佺紦鍐插尯鏈夎凍澶熺殑絀洪棿錛屽氨絝嬪埢鎶婃暟鎹濉炲埌鍙戦佺紦鍐插尯鍘伙紝鐒跺悗璧頒漢錛屽傛灉鍙戦佺紦瀛樺尯婊′簡錛岀┖闂翠笉瓚籌紝閭g洿鎺ュ甫鐫榪斿洖鐨-1鍜孍AGAIN璧頒漢銆傝嚦浜嶪O澶氳礬澶嶇敤錛岄栧厛瑕佺悊瑙g殑鏄錛屾搷浣滅郴緇熶負浣犳彁渚涗簡涓涓鍔熻兘錛屽綋浣犵殑鏌愪釜socket鎺ユ敹緙撳瓨鍖烘湁鏁版嵁鍙璇伙紝鎴栬呭彂閫佺紦鍐插尯鏈夌┖闂村彲鍐欑殑鏃跺欙紝瀹冨彲浠ョ粰浣犱竴涓閫氱煡銆
榪欐牱褰撻厤鍚堥潪闃誨炵殑socket浣跨敤鏃訛紝鍙鏈夊綋緋葷粺閫氱煡鎴戝摢涓鎻忚堪絎﹀彲璇諱簡錛屾垜鎵嶅幓鎵ц宺ead鎿嶄綔錛屽彲浠ヤ繚璇佹瘡嬈read閮借兘璇誨埌鏈夋晥鏁版嵁鑰屼笉鍋氱函榪斿洖-1鍜孍AGAIN鐨勬棤鐢ㄥ姛銆
鍐欐搷浣滅被浼箋
鎿嶄綔緋葷粺鐨勮繖涓鍔熻兘閫氳繃select/poll/epoll涔嬬被鐨勭郴緇熻皟鐢ㄥ嚱鏁版潵浣跨敤錛岃繖浜涘嚱鏁伴兘鍙浠ュ悓鏃剁洃瑙嗗氫釜鎻忚堪絎︾殑璇誨啓灝辯華鐘跺喌錛岃繖鏍鳳紝澶氫釜鎻忚堪絎︾殑I/O鎿嶄綔閮借兘鍦ㄤ竴涓綰跨▼鍐呭畬鎴愶紝榪欏氨鍙獻/O澶氳礬澶嶇敤錛岃繖閲岀殑鈥滃嶇敤鈥濇寚鐨勬槸澶嶇敤鍚屼竴涓綰跨▼銆傝嚦浜庝簨浠墮┍鍔錛屽叾瀹炴槸I/O澶氳礬澶嶇敤鐨勪竴涓鍙﹀栫殑縐板懠銆傝嚦浜庡紓姝ュ悓姝ワ紝鎴戜滑甯歌佺殑linux涓嬬殑緗戠粶緙栫▼妯″瀷澶ч儴鍒嗛兘鏄鍚屾io錛屼互璇繪搷浣滀負渚嬶紝鏈璐ㄤ笂閮芥槸闇瑕佺敤鎴瘋皟鐢╮ead/recv鍘諱粠鍐呮牳緙撳啿鍖烘妸鏁版嵁璇誨畬鍐嶅勭悊涓氬姟閫昏緫銆
寮傛io鍒欐槸鍐呮牳宸茬粡鎶婃暟鎹璇誨ソ浜嗭紝鐢ㄦ埛鐩存帴澶勭悊閫昏緫銆
寮傛IO鍦╨inux涓嬩竴鑸鏄鐢╝io搴撱
linuxaccept()鍑芥暟涓鐩村勪簬闃誨炵姸鎬,浠涔堝師鍥狅紵
accept錛堬級鍑芥暟灝辨槸闃誨炵殑鍟婏紝瑕佺瓑寰呮帴鏀跺埌鏈夊㈡埛絝璇鋒眰鎵嶅彲浠ヨ繘琛屽悗緇鐨勬搷浣滐紝浣犳墍璋撶殑涓嶅彲浠ユ槸鎸囦粈涔堬紵
open緋葷粺浣跨敤鎶宸э紵
open緋葷粺鏄澶氱嶈璦銆佺幆澧冪殑涓縐嶅嚱鏁般
LINUX涓璷pen鍑芥暟浣滅敤錛氭墦寮鍜屽壋寤烘枃浠躲侾B紼嬪簭璇璦涓璷pen鍔熻兘錛氭墦寮紿楀彛銆
瀵逛簬open緋葷粺鏉ヨ達紝絎涓変釜鍙傛暟浠呭綋鍒涘緩鏂版枃浠舵椂錛堝嵆浣跨敤浜哋_CREAT鏃訛級鎵嶄嬌鐢錛岀敤浜庢寚瀹氭枃浠剁殑璁塊棶鏉冮檺浣嶃
pathname鏄寰呮墦寮/鍒涘緩鏂囦歡鐨凱OSIX璺寰勫悕錛沠lags鐢ㄤ簬鎸囧畾鏂囦歡鐨勬墦寮/鍒涘緩妯″紡錛岃繖涓鍙傛暟鍙鐢變互涓嬪父閲忛氳繃閫昏緫浣嶆垨閫昏緫鏋勬垚銆
鎵撳紑/鍒涘緩鏂囦歡鏃訛紝鑷沖皯寰椾嬌鐢ㄤ笂榪頒笁涓甯擱噺涓鐨勪竴涓銆
浠ヤ笅甯擱噺鏄閫夌敤鐨勶細
1.璁劇疆涓洪潪闃誨炴ā寮
2.浠ヤ笅涓変釜甯擱噺鍚屾牱鏄閫夌敤鐨勶紝瀹冧滑鐢ㄤ簬鍚屾ヨ緭鍏ヨ緭鍑
3.open榪斿洖鐨勬枃浠舵弿榪扮︿竴瀹氭槸鏈灝忕殑鏈琚浣跨敤鐨勬弿榪扮︺
⑷ linux shell 命名管道被阻塞
並不像你想像的那樣(son一直讀取fifo), son 只會讀取一次 fifo 文件就結束了。由於father1第二次寫的時候沒有讀取者,所以你的寫fifo的函數就會被block。 把son 改成
function son (){
while true
do
read line <$pipe
echo from pipe:$LINE
done
}
即可,當然,你可以考慮在 son 中加上判斷結束的條件,比如從fifo中讀到特定字元串就退出循環等。這里不再贅述。