linux程序間通訊-訊號量
引入訊號量之前,先介紹幾個概念:
1.臨界資源:同一時刻只允許一個程序或執行緒訪問的資源。(有時候是有限個程序或執行緒訪問),就比如一支筆一次只能是一個人使用。
這裡的臨界資源在c語言或c++中的表現就是從程式碼段開始,一直到堆區的這一部分,我們將其稱之為臨界資源,對於每一個程序,都有各自獨立的棧,所以程序之間棧不是共享的,除了棧以外的程式碼段,資料段,只讀資料段,堆區這幾個記憶體結構可以說是一個程式中不同程序間的臨界資源。
2.臨界區:訪問臨界資源的程式碼段,也就是說該程式碼執行後會去訪問臨界資源。它可以是一個硬體,也可以是一個軟體。
3.原子操作:指的是不可被分割,不能被打斷的操作。在我們的程式碼段,將程式碼轉換為指令儲存起來,一條指令的執行肯定不會被打斷,不然就會出錯。而如果不想被打斷,那這裡面做了什麼,加入了哪些操作,才能使得好幾個操作合成一個原子操作?
4.訊號量
它本身不具備資料交換的功能,而是通過控制其他的通訊資源來實現程序間通訊的。它是一種外部資源的標識,只能取正整數,並且它自身的加一減一過程是原子操作。如果訊號量的值為0,再進行減一時會阻塞。
訊號量方法:
semget():建立一個訊號量,或者獲取一個已有的訊號量
如果是第一次建立時,需要對該訊號量賦許可權。
semop():完成對訊號量值的修改,(+1,-1操作)
semctl():對訊號量做控制,可以為訊號量賦初始值,也可以刪除訊號量。
訊號量是由核心做控制的,它不屬於某一個程序,我們在使用時只是查詢它的介面,再進行使用。
semget();
返回一個int型,獲取失敗,則返回-1。其中有三個引數:訊號量名稱,訊號量的個數,許可權。具體的使用可以用man命令來查詢。
semop():
返回值這裡同上,引數為:訊號量id,訊號量個數,設定初始值命令,等。
semop();
返回值這裡同上,引數為:訊號量id,一個結構體變數,訊號量的個數。
在這個結構體變數中對其進行p操作和v操作。
銷燬訊號量:
銷燬的是訊號量所在的集合,通常在建立訊號量時,先移除再建立。