System V消息队列(1)
1,内核中的某个消息队列可表示如下:
其中msqid_ds结构体为:
struct msqid_ds { struct ipc_perm msg_perm; /* see Section 15.6.2 */ msgqnum_t msg_qnum; /* # of messages on queue */ msglen_t msg_qbytes; /* max # of bytes on queue */ pid_t msg_lspid; /* pid of last msgsnd() */ pid_t msg_lrpid; /* pid of last msgrcv() */ time_t msg_stime; /* last-msgsnd() time */ time_t msg_rtime; /* last-msgrcv() time */ time_t msg_ctime; /* last-change time */ };
2,常用函数为:
#include <sys/msg.h> int msgget(key_t key,int oflag);//创建一个新的消息队列或者访问一个已存在的信息队列 int msgsnd(int msqid,const void *ptr,size_t length,int flag);//发消息 其中ptr是一个结构体指针,模板如下: struct msgbuf{ long msgbuf;//必需大于 0 char mtext[1]; }; ssize_t msgrcv(int msqid,void *ptr,size_t lenght,long type,int flag);//收消息 int msgctl(int msqid,int cmd,struct msqid_ds *buf); //cmd=IPC_RMID,删除msqid指定的消息队列 //cmd=IPC_SET,设置指定消息队列的msqid_ds结构体中的msg_perm.uid,msg_perm.gid,msg_perm.mode, // msg_qbytes的值 //cmd=IPC_STAT,返回当前msqid_ds结构
例子:
#include <stdio.h> #include <stdlib.h> #include <sys/msg.h> #define MSG_R 0400 #define MSG_W 0200 #define MODE (MSG_R|MSG_W|MSG_R>>3|MSG_R>>6|IPC_CREAT) struct my_msgbuff{ long mtype; char mtext[1]; char *buff; }; int main(void) { int msgid; char msg_test[]="I'm a test"; struct my_msgbuff send_msg,rec_msg; struct msqid_ds info; msgid=msgget(IPC_PRIVATE,MODE); msgctl(msgid,IPC_STAT,&info); printf("发送信息前:消息的个数 =%lu\n",info.msg_qnum); send_msg.mtype=100; send_msg.buff=msg_test; msgsnd(msgid,(void *)&send_msg,sizeof(send_msg)-sizeof(long),IPC_NOWAIT); msgctl(msgid,IPC_STAT,&info); printf("发送信息后:消息的个数 =%lu\n",info.msg_qnum); msgrcv(msgid,(void *)&rec_msg,sizeof(rec_msg)+1,100,IPC_NOWAIT); if(rec_msg.buff!=NULL){ printf("收到的信息为:%s\n",rec_msg.buff); } else{ printf("接收信息失败\n"); } msgctl(msgid,IPC_STAT,&info); printf("接收信息后:消息的个数 =%lu\n",info.msg_qnum); msgctl(msgid,IPC_RMID,NULL); return EXIT_SUCCESS; }
4,运行结果:
发送信息前:消息的个数 =0 发送信息后:消息的个数 =1 收到的信息为:I'm a test 接收信息后:消息的个数 =0