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

 

 

posted @ 2013-12-27 20:50  sxcww  阅读(276)  评论(0编辑  收藏  举报