Linux程式間通訊2

mf1crystal發表於2017-12-07

共享記憶體
是被多個程式共享的一部分實體記憶體.共享記憶體是程式間共享資料的一種最快的方法,一個程式向共享記憶體區域寫入了資料,共享這個記憶體區域的所有程式就可以立刻看到其中的內容
共享記憶體實現分為兩個步驟:
一、建立共享記憶體,使用shmget函式
二、對映共享記憶體,將這段建立的共享記憶體對映到具體的程式空間去,使用shmat函式
當一個程式不再需要共享記憶體時,需要把它從程式地址空間中脫離。
int shmdt ( char *shmaddr )
訊息佇列
unix早期通訊機制之一的訊號能夠傳送的資訊量有限,管道則只能傳送無格式的位元組流,這無疑會給應用程式開發帶來不便。訊息佇列(也叫做報文佇列)則克服了這些缺點。
發展
訊息佇列就是一個訊息的連結串列.可以把訊息看作一個記錄,具有特定的格式.程式可以向中按照一定的規則新增新訊息;另一些程式則可以從訊息佇列中讀走訊息
目前主要有兩種型別的訊息佇列:
POSIX訊息佇列以及系統V訊息佇列,系統V訊息佇列目前被大量使用
系統V訊息佇列是隨核心持續的,只有在核心重起或者人工刪除時,該訊息佇列才會被刪除
鍵值
訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得一個訊息佇列的描述字,必須提供該訊息佇列的鍵值
在以下兩種情況下,將建立一個新的訊息佇列:
1、如果沒有與健值key相對應的訊息佇列,並且 msgflg中包含了IPC_CREAT標誌位。
2、key引數為IPC_PRIVATE
傳送訊息

include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid,struct                            msgbuf*msgp,int msgsz,int msgflg

功能:向訊息佇列中傳送一條訊息
Msqid: 已開啟的訊息佇列id
Msgp: 存放訊息的結構
Msgsz: 訊息資料長度
Msgflg:
傳送標誌,有意義的msgflg標誌為IPC_NOWAIT,指明在訊息佇列沒有足夠空間容納要傳送的訊息時,msgsnd是否等待
訊息格式

          struct msgbuf
    {
      long mtype;/*訊息型別*/
      char mtext[1]; /*訊息資料的首地址*/
     }
     *接收訊息*
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msqid, struct msgbuf *msgp, int   msgsz, long msgtyp, int msgflg)

功能:
從msqid代表的訊息佇列中讀取一個msgtyp型別的訊息,並把訊息儲存在msgp指向的msgbuf結構中。在成功地讀取了一條訊息以後,佇列中的這條訊息將被刪除
訊號量
訊號量(又名:訊號燈)與其他程式間通訊方式不大相同,主要用途是保護臨界資源.
程式可以根據它判定是否能夠訪問某些共享資源。除了用於訪問控制外,還可用於程式同步
分類
二值訊號燈:訊號燈的值只能取0或1,類似於互斥鎖。 但兩者有不同:
訊號燈強調共享資源,只要共享資源可用,其他程式同樣可以修改訊號燈的值;
互斥鎖更強調程式,佔用資源的程式使用完資源後,必須由程式本身來解鎖。
計數訊號燈:訊號燈的值可以取任意非負值

相關文章