linux消息隊列的使用


消息隊列


*消息隊列是內核地址空間中的內部鏈表,通過內核在各個進程之間傳遞的內容。消息順序發送到消息隊列中,每個消息隊列都有IPC標識符唯一地進行標識。

msgbuf結構

struct msgbuf{
    long mtype; //消息類型
    char mtext[1];  //消息數據
};

msgid_ds結構

struct msqid_ds{
    struct ipc_perm msg_perm;
    time_t  msg_stime;  //發送到隊列的最后一個消息的時間戳
    time_t  msg_rtime;  //從隊列中獲取的最后一個消息的時間戳
    time_t  msg_ctime;  //對隊列進行最后一次變動的時間戳
    unsigned long   __msg_cbytes;   //在隊列上所駐留的字節總數
    msgqnum_t   msg_qnum;   //當前處於隊列中的消息數目
    msglen_t    msg_qbytes; //隊列中能容納的字節的最大數目
    pid_t   msg_lspid   //發送最后一個消息進程的PID
    pid_t   msg_lrpid   //接收最后一個消息進程的PID
};

ipc_perm結構

struct ipc_perm{
    key_t   key;    //函數msget()使用的鍵值
    uid_t   uid;    //用戶的UID
    gid_t   gid;    //用戶的GID
    uid_t   cuid;   //建立者的UID
    gid_t   cgid;   //建立者的GID
    unsigned short  mode;   //權限
    unsigned short  seq;    //序列號
};

鍵值構建ftok()函數

#include<sys/types.h>
#include<sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
//pathname必須是已經存在的目錄

獲得消息msgget()函數

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgget(key_t key, int msgflg);
/*第一個參數可以用ftok()函數生成
msgflg參數:
1.IPC_CREAT 如果內核中不存在該消息隊列,則創建它
2.IPC_EXCL  當和IPC_CREAT一起使用時,如果隊列早已存在則將出錯
*/

發送消息msgsend()函數

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
int msgsend(int msqid, const void *msgp, size_t msgsz, int msgflg);
/*
第一個參數從msgget()獲得
第二個參數指向一個消息緩沖區
第三個參數消息的大小,以字節為單位,不包括消息類型的長度(4字節)
第四個參數設置成0表示忽略,設置成IPC_NOWAIT,如果消息隊列已經滿了,則消息不寫進隊列中,如果不設置則阻塞直到可以寫消息為止
*/

接收消息msgrcv()函數

#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
/*
第一個參數從msgget()獲得
第二個參數消息緩沖變量的地址
第三個參數消息的大小,以字節為單位,不包括消息類型的長度(4字節)
第四個參數指定要從隊列中獲取的消息類型,內核查找隊列中匹配類型的第一個到達的消息,如果傳0則返回隊列最早的消息,不管類型
第五個參數設置成IPC_NOWAIT,如果消息隊列沒有消息則返回ENOMSG,否則進程將阻塞直到滿足條件的消息到達,如果客戶等待消息的時候隊列被刪除則返回EIDRM,如果進程阻塞並等待消息的時候捕獲信號則返回EINTR
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM