1.測試**
#include#include#include#include#include#include#include#includevoid msg_show(int msg_id,struct msqid_ds msg_info)
printf("\n");
/*show msg_info*/
printf("the uid of msg is %d\n",msg_info.msg_perm.uid);
printf("the gid of msg is %d\n",msg_info.msg_perm.gid);
printf("現在訊息佇列中的位元組數: %ld\n",msg_info.msg_cbytes);
printf("現在佇列中的訊息數: %d\n",msg_info.msg_qnum);
printf("現在訊息佇列中的最大位元組數: %d\n",msg_info.msg_qbytes);
printf("最後傳送訊息的程序: %d\n",msg_info.msg_lspid);
printf("最後接受訊息的程序: %d\n",msg_info.msg_lrpid);
}int main()
; struct msqid_ds msg_info; /*creat msg queue*/
struct msgmbuf msg_mbuf; /*訊息緩衝結構*/
char *rpath="/home/18/";
int msg_sflags,msg_rflags;
key=ftok(rpath,'b'); /*create key*/
if(-1!=key)
else
msg_flags=ipc_creat|ipc_excl;
msg_id=msgget(key,msg_flags);
if(-1==msg_id)
msg_show(msg_id,msg_info);
memcpy(msg_mbuf.mtext,"test message",sizeof("test message"));
ret=msgsnd(msg_id,&msg_mbuf,sizeof("test message!!"),ipc_nowait);
if(ret==-1)
printf("send failed!\n");
msg_show(msg_id,msg_info);
msg_rflags=ipc_nowait|msg_noerror;
ret=msgrcv(msg_id,&msg_mbuf,20,0,msg_rflags);
if(-1==ret)
printf("mes receive failed!!\n");
msg_show(msg_id,msg_info);
msg_info.msg_perm.uid=8;
msg_info.msg_perm.gid=8;
msg_info.msg_qbytes=12345;
ret=msgctl(msg_id,ipc_set,&msg_info);/*set the property of msg*/
if(-1==ret)
msg_show(msg_id,msg_info);
ret=msgctl(msg_id,ipc_rmid,null);
if(ret==-1)
printf("delete failed!!\n");
return 0;
}
2.訊息佇列結構
什麼是訊息佇列?
訊息佇列是核心位址空間的內部鍊錶,通過linux各個程序之間傳遞訊息。訊息佇列通過ipc識別符號區分
佇列上乙個訊息的結構
#includestruct msgbuf
該結構可以自己定義
訊息的大小在msg.h中有限制
#define msgmax 8192
訊息佇列結構
#includestruct msqid_ds
;struct ipc_perm
;
3.操作函式
鍵值構建函式
#include#includekey_t ftok(const char *pathname,int proj_id);
//如:
key_t key;
char *rpath="/ipc/msg/"
key=ftok(rpath,'a');
//第乙個引數是已經存在的目錄
//第二個引數一般是『a』,'b'
從佇列中獲取訊息
#include#include#includeint msgget(key_t key,int msgflag);
//第乙個引數是鍵值,用ftok()生成,拿來與核心中訊息佇列的值比較
//megflag取值如下:
ipc_creat:如果比較過後核心空間沒有該訊息佇列,就建立它
ipc_excl:通常與ipc_creat一起使用,如msgflag=ipc_creat|ipc_excl;
//返回值:meg_id==>佇列識別符號
傳送訊息函式
#include#include#includeint msgsnd(int msgqid,const void *msgp,size_t msgsz,int msgflag);
//第乙個引數是用msgget得到的識別符號
//第二個是指向訊息緩衝區
//第三個是訊息的大小(以位元組為單位),不包含訊息型別
//可取值:
0:表示忽略
ipc_nowait:
//返回值:-1表示傳送訊息失敗
接收訊息函式
#include#include#includessize_t msgrcv(int msqid,void* msgp,size_t msgsz,logn msgtyp,int msg***);
//第乙個引數指定訊息佇列
//第二個指向存放訊息緩衝區
//第三個緩衝區大小(不包括mtype)
//第四個訊息型別(如果為0返回佇列中最老的訊息)
//第五個
訊息控制函式
#include#include#includeint msgctl(int msqid,int cmd,struct msqid_ds *buf);
//函式用途:向核心傳送乙個cmd命令,buf為應用層和核心空間資料交換的指標
cmd取值為:
ipc_stat:獲取佇列的msqid_ds結構,並把它存在buf位址中
ipc_set:設定佇列的ipc_perm成員值,這個值先存在buf裡
ipc_rmid:刪除佇列
程序通訊之訊息佇列
程序通訊之訊息佇列 一 前言 前面講過,程序間管道的通訊,訊號量控制的通訊,以及一開始的訊號,這些都是程序的通訊方式。訊號通過響應某些條件產生事件,使得另一程序 即接收訊號的程序 做出相應的反應。管道是通過一端寫,另一端讀的方式進行通訊,即所謂的點對點通訊。訊號量是控制程序間對臨界資源訪問的乙個計數...
程序間通訊之訊息佇列
include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...
linux c 程序通訊之訊息佇列
訊息佇列是乙個存放在核心中的訊息鍊錶,每個訊息佇列由佇列識別符號標識,與管道不同的是訊息佇列是放在核心當中,只有在核心重啟,或者顯式的刪除乙個訊息佇列,該訊息佇列才會被真正的刪除,以下會有幾個操作,1.建立訊息佇列 include include key t ftok const char path...