Linux 學習筆記17 計數訊號量

2021-10-04 20:31:44 字數 1701 閱讀 5425

計數訊號量原理:

計數訊號量**如下:

#include

//生產者和消費者模型

//倉庫貨架空位 10 定為0號訊號量

//產品數目 0 定為 1 號訊號量

intmain

(int argc,

char

* ar**)

;//第乙個為倉庫貨架空位個數,第二個為產品個數

int ret=

semctl

(sems_id,

0,setall,arr)

;error_check

(ret,-1

,"semctl");

//令父程序為生產者,子程序為消費者。

struct sembuf sopp,sopv;if(

!fork()

)}else

}return0;

}

執行效果如下:

//生產者和消費者模型

//倉庫貨架空位 10 定為0號訊號量

//產品數目 0 定為 1 號訊號量

?int

main

(int argc,

char

* ar**)

;//第乙個為倉庫貨架空位個數,第二個為產品個數

int ret=

semctl

(sems_id,

0,setall,arr)

;error_check

(ret,-1

,"semctl");

//令父程序為生產者,子程序為消費者。

struct sembuf sopp,sopv;if(

fork()

)}else

}return0;

}執行效果如下:

可發現,在sem_undo 的執行下,將子程序(生產者)終止後,會使之前生產的產品重置,即讓**回到原來還未執行時的狀態。

如果將sem_undo 的效果去除,則會得到如下的執行效果:

顯然,倉庫產品數和貨架空位超過了最大值10,發生了錯誤。

沒有使用 sem_undo 死鎖的**如下:

#include

#define n 10000000

//例:訊號量崩潰,產生死鎖

intmain

(int argc,

char

* ar**)

else

else

printf

("result=%d\n"

,p[0])

;}return0;

}

執行效果如下:

可見子程序崩潰,產生了殭屍程序(z),程式死鎖,導致無法往下執行。

linux學習筆記17

vim vim介紹 vim是vi的公升級版,vim和vi的最大區別就是編輯乙個文字時vi不會顯示顏色,vim會顯示顏色,vim的安裝方法yum install y vim enhanced。vim顏色顯示 vim的顏色和你檔案的具體內容有關,相同的檔案在不同的目錄下都有可能導致顏色不存在,vim的配...

APUE學習筆記 17 執行緒和訊號

by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。3.執行緒的訊號遮蔽字 每個執行緒都有自己的執行緒遮蔽字,但是訊號處理函式是程序中所有執行緒...

APUE學習筆記 17 執行緒和訊號

by 潘雲登 date 2009 8 22 email intrepyd gmail.com homepage 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix環境高階程式設計 第2版 第12章。2.總結了如何設定執行緒的訊號遮蔽字,以及如何使用專用線程進行訊號處理。...