進程間通信---消息隊列

    什麼是消息隊列?

    消息隊列提供了一種從進程向另一個進程發送一個數據塊的方法。每個數據塊都被認爲是有一個類型,接收者進程的數據塊可以有不同的類型值。


    消息隊列與管道的區別:消息隊列是基於消息的,而管道是基於字節流的,且消息隊列的讀取不一定是先入先出。


    相關函數

  1. 創建新消息隊列或取得已存在消息隊列


    wKioL1eR0eqhIKXhAAAUWUWTU_0698.png

    wKioL1eR0erx7K7oAAAZVXG3GxE525.png

  2. 返回值:成功,返回消息隊列的標識符

            失敗,返回-1

   第一個參數:消息隊列對象的關鍵字,函數將它與已有的消息隊列對象的關鍵字進行比較來判斷消息                隊列是否已經創建。由函數ftok()得來。

   第二個參數:控制函數的具體操作。可以取以下幾個值:

   IPC_CREAT:如果消息隊列不存在則創建,否則直接打開。

   IPC_EXCL:單獨使用無意義。

   IPC_CREAR | IPC_EXCL :消息隊列時新創建的。


3. ftok函數

   函數ftok把一個已存在的路徑名和一個整數標識得轉換成一個key_t值,稱爲IPC鍵。

   key_t ftok(const char* patnname,int id);

   pathname:路徑必須存在且可以訪問

   id: 低8位


4. 向隊列讀/寫消息

   

   msgsnd將數據放到消息隊列中,msgrcv從隊列中取消息

wKiom1eR1vWTNmx0AAAwxg03-Z0275.png


    msqid: 消息隊列的標識符

    msgp:  指向消息緩衝區的指針,此位置用來暫時存儲發送和接受的消息,是用戶定義的通用的結構。

    msgsz:消息的大小

    msgtyp:從消息隊列內讀取的消息形態。若爲0,則消息隊列中的所有消息都被取完。

    msgflg: msgflg爲0時,msgsnd()和msgrcv()在隊列呈滿或空的情形時,採取阻塞等待的處理模式。

            msgflg和常數連用時,msgsnd()執行時若隊列滿,msgrcv()將不會阻塞,而是返回-1,若             執行msgrcv(),則在消息隊列呈空時,等待不做返回-1.


5. 設置消息隊列的屬性

   函數原型: int msgctl(int msgqid,int cmd,struct msqid_ds *buf);

   對msgqid標識的消息隊列執行cmd操作。cmd操作分三種:IPC_STAT,IPC_SET,IPC_RMID

   IPC_STAT:該命令用來獲取消息隊列對應的msqid_ds數據結構,並將其保存到buf指定的地址空間。

   IPC_SET:該命令用來設置消息隊列的屬性,要設置的屬性存儲在buf中。

   IPC_RMID:從內核中刪除msqid標識的消息隊列。


6. 查看消息隊列    ipcs -q

   刪除消息隊列    ipcrm -q semid


“comm.h”

wKioL1eR3NWQmrJ4AACWHzhf3fE800.png


“comm.c”

wKiom1eR3NWQV3zeAABrVaXgs1I529.png

wKioL1eR3NXRYI_CAABwBZ7GKrI414.png

wKiom1eR3NayMK8eAABF5YXwqMw423.png

“client.c”

wKioL1eR3aOwLr3TAABlwPvpCEo142.png


“server.c”

wKiom1eR3aOCGOF5AABX_MSHtZM255.png


wKioL1eR3r2TRms8AAC_YmB5VG4209.png



wKiom1eR363z2m3-AAA8narvXh4120.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章