*消息隊列是內核地址空間中的內部鏈表,經過內核在各個進程之間傳遞的內容。消息順序發送到消息隊列中,每一個消息隊列都有IPC標識符惟一地進行標識。函數
struct msgbuf{ long mtype; //消息類型 char mtext[1]; //消息數據 };
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 };
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; //序列號 };
#include<sys/types.h> #include<sys/ipc.h> key_t ftok(const char *pathname, int proj_id); //pathname必須是已經存在的目錄
#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一塊兒使用時,若是隊列早已存在則將出錯 */
#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,若是消息隊列已經滿了,則消息不寫進隊列中,若是不設置則阻塞直到能夠寫消息爲止 */
#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 */