Linux下多工間通訊和同步 訊息佇列

2021-06-18 17:15:28 字數 1171 閱讀 4293

訊息佇列簡稱為佇列.訊息佇列就是一些訊息的列表.使用者可以在訊息佇列中新增訊息和讀取訊息等.從這點上看,訊息佇列具有一定的fifo特性,但是它可以實現訊息的隨機查詢,比fifo具有更大的優勢.同時,這些訊息又是存在於核心中的,由"佇列id"來標識. 

訊息佇列的實現包括建立或開啟訊息佇列,新增訊息,讀取訊息和控制訊息佇列這四種操作:

建立或開啟訊息佇列使用的函式是msgget,這裡建立的訊息佇列的數量會受到系統訊息佇列數量的限制;

新增訊息使用的函式是msgsnd函式,它把訊息新增到已開啟的訊息佇列末尾;

讀取訊息使用的函式是msgrcv,它把訊息從訊息佇列中取走,與fifo不同的是,這裡可以指定取走某一條訊息;

控制訊息佇列使用的函式是msgctl,它可以完成多項功能.

msgget系統呼叫

該系統呼叫建立或開啟乙個訊息佇列.msgget函式語法:

其中,msgflag可以為:ipc_creat,ipc_exec,ipc_nowait或者三者的組合.在一下兩種情況下,該呼叫將建立乙個新的訊息佇列:

如果沒有訊息佇列與鍵值key相對應,並且msgfalg中包含ipc_creat標誌位;

key引數為ipc_private.

msgsnd系統呼叫

該系統呼叫行msgid代表的訊息佇列傳送乙個訊息.msgsnd函式語法:

對於傳送訊息來說,有意義的msgflag標誌位ipc_nowait,指明在訊息佇列沒有足夠容納要傳送的訊息時,msgsnd是否等待.造成msgsnd等待的條件有兩種:

當前訊息的大小與當前訊息佇列中的位元組數之和操作了訊息佇列的總容量;

當前訊息佇列中的訊息數(單位:個)不小於訊息佇列的總容量(單位:位元組數),此時,雖然訊息佇列中的訊息數目很多,但基本上都只有乙個位元組.

msgsnd解除阻塞的條件有三個:

不滿足上述兩個,即訊息佇列中有容納該訊息的空間

msqid代表的訊息佇列被刪除

呼叫msgsnd的程序被程序打斷

msgrcv系統呼叫

該系統呼叫從id為msgid的訊息佇列中讀取乙個訊息,並把訊息儲存子啊msgq指向的msgbuf結構中.msgrcv函式語法:

msgrcv解除阻塞的條件有三個:

訊息佇列中有了滿足條件的訊息;

msqid代表的訊息佇列被刪除;

呼叫msgrcv的程序被訊號中斷.

msgctl系統呼叫

多工13 程序間通訊 Queue

process之間有時需要通訊,作業系統提供了很多機制來實現程序間的通訊。可以使用multiprocessing模組的queue實現多程序之間的資料傳遞,queue本身是乙個訊息列隊程式,首先用乙個小例項來演示一下queue的工作原理 coding utf 8 from multiprocessin...

Linux 多工程式設計 多工的同步與互斥

現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...

linux之多工的同步與互斥

基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中。1 都需要訪問 使用同一種資源 2 多個任務之間有依賴關係,某個任務的執行依賴於另乙個任務 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。是指散步在不同任務之間的若...