五、訊息佇列
訊息佇列就是乙個訊息的鍊錶。可以把訊息看作是乙個記錄,具有特定格式。程序可以向中按照一定的規則新增新訊息;另一些程序則可以從訊息佇列中讀走訊息。目前有posix訊息佇列,但系統v訊息佇列被大量使用。
1、持續性
系統v訊息佇列是隨核心持續的,只有在核心重啟或人工刪除時,該訊息佇列才會被刪除。
2、鍵值
訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,必須提供該訊息佇列的鍵值。
鍵值的獲得:
#include
#include
key_t ftok(char *pathname,char proj)
功能:返回檔名對應的鍵值。
pathname:檔名
proj:專案名(不為0即可)
3、開啟和建立訊息佇列
#include
#include
#include
int msgget(key_t key,int msg***)
key:鍵值,由ftok獲得
msg***:標誌位。
返回值:與鍵值key相對應的訊息佇列描述字。
標誌位msg***的值:
ipc_creat:建立新的訊息佇列
ipc_excl:與ipc_creat一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤。
ipc_nowait:讀寫訊息佇列要求無法得到滿足時,不阻塞。
在以下兩種情況下,將建立新的訊息佇列:
1)如果沒有與鍵值key相對應的訊息佇列,並且msg***中包含了ipc_creat標誌位
2)key引數為ipc_private。
4、傳送訊息
#include
#include
#include
int msgsnd(int msgid,struct msgbuf *msgp,int msgsz,int msg***)
功能:向訊息佇列中傳送一條訊息,成功時返回0,失敗時返回-1。
引數:msgid:已開啟的訊息佇列的id
msgp:指向訊息緩衝區得指標,此位置用來暫時儲存傳送和接收的訊息,是乙個使用者可自定義的通用結構,
msgsz:訊息資料的長度
msg***:傳送訊息標誌,有意義的msg***標誌位ipc_nowait,指明在訊息佇列沒有足夠空間容納要傳送的訊息,msgsnd是否等待。
5、訊息格式
struct msgbuf
6、接收訊息
#include
#include
#include
int msgrcv(int msgid,struct msgbuf *msgp,int msgsz,long msgtyp,int msg***)
功能:從msgid代表的訊息佇列中讀取乙個msgtyp型別的訊息,並把訊息儲存在msgp指向的msgbuf結構中。在成功的讀取了一條訊息後,佇列中的這條訊息將被刪除。
六、訊號量
訊號量(又名:訊號燈)與其他程序間通訊方式不大一樣,主要用途是保護臨界資源。程序可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程序同步。
1、分類
二值訊號燈:訊號燈的值只能取0或1,類似於互斥鎖。但兩者有不同:訊號燈強調共享資源,只要共享資源可用,其他程序同樣可以修改訊號燈的值;互斥鎖更強調程序,占用資源的程序使用完資源後,必須由程序本身來解鎖。
計數訊號燈:訊號燈的值可以取任意非負數。比如乙個訊號燈的值是10,那麼每乙個程序訪問資源,訊號燈就減1,直到減為0時其他程序就無法訪問了,換句話說,訊號燈的值就是有多少個程序可以訪問的個數。
2、建立或開啟
#include
#include
#include
int semget(key_t key,int nsems,int sem***)
key:鍵值,有ftok獲得
nsems:指定開啟或者建立的訊號燈集中將包含訊號燈的數目
sem***:標識,同訊息佇列一樣
返回值:訊號量集得id
3、操作
int semop(int semid.struct sembuf *sops,unsgined nsops)
功能:對訊號量進行控制(對訊號量進行獲取還是釋放)
semid:訊號量集得id
sops:是乙個運算元組,表明要進行什麼操作
nsops:sops所指向的陣列的元素個數
struct sembuf
sem_num:要操作的訊號量在訊號集中的編號,第乙個訊號編號是0
sem_op:如果是正值,該值會加到現有的訊號量值中,通常用於釋放訊號量;如果為負值,而其絕對值又大於訊號的現值,操作將會阻塞,知道訊號值大於等於sem_op的絕對值,通常用於獲取訊號量;如果sem_op的值為0,則操作將暫時阻塞,直到訊號的值變為0.
sem_***:訊號操作標誌,可能有兩種值:
ipc_nowait:對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。
ipc_undo:程式結束時(不論正常還是不正常)釋放訊號量,這樣做的目的在於避免程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。
程序間通訊(二)
傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...
程序間通訊《二》
sysv 共享記憶體。sysv 共享記憶體和posix 共享記憶體類似。主要用到的api有 shmget,shmat,shmctl,shmdt,下面將這些api一一道來。intshmget key t key,size t size,intoflag 返回 成功返回共享記憶體的描述字,出錯時 1 在...
程序間通訊(二)
傳遞更多的資料 到目前為止我們所用的機制只是簡單的在乙個fread或是fwrite中傳送或是接收全部的資料。有時我們也許以更小的尺寸傳送資料,或是也許我們並不知道輸出的大小。為了避免宣告乙個大的緩衝區,我們可以使用多個fread或是fwrite呼叫並分別處理這些資料。下面是乙個程式,popen3.c...