message queue

来源:互联网 发布:阿迪达斯网络销售额 编辑:程序博客网 时间:2024/05/05 05:24

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
 long mtype; //消息类型必须大于0
 char mtext[BUFSIZ];
}msg_info;

int creat_msg_queue()
{
        key_t key;
        int proj_id;
        int msqid;

        struct msqid_ds buffer;

        proj_id=2;
        key=ftok("/home/program",proj_id);
        if(key==-1){
                perror("cannot generate the IPC key");
                return -1;
        }

        msqid=msgget(key,IPC_CREAT | 0660);
        if(msqid==-1){
                perror("cannot create message queue resource");
                return -1;
        }

 return msqid;
}


int send_msg(int msqid,char* msg)
{
 int result;
 
 msg_info buf;
 
 buf.mtype=100;
 strcpy(buf.mtext,msg);
 
 result=msgsnd(msqid,&buf,strlen(msg),0);

 //最后一个参数 flag 既可以是0也可以是IPC_NOWAIT :如果没有存放消息的空间,就立马返回。同理,若msgrcv如设置这个IPC_NOWAIT 标志,在没有消息得到的情况下,就会立即返回一个ENOMSG错误。
1)
  perror("cannot send message to the message queue");
 
 return result;
}

int show_msg_queue_stat(int msqid)
{
 struct msqid_ds buffer;
 int flg;

//提供一个消息队列上的各种控制操作 IPC_STAT :通过给buffer 返回与所指定消息队列对应的当前msgqi_ds结构信息。

 flg=msgctl(msqid,IPC_STAT,&buffer);
 if(flg==-1){
  perror("cannot get status of the message queue");
  return -1;
 } 

        printf("=======Message Queue Info========\n");
        printf("effective user id : %d \n",buffer.msg_perm.uid);
        printf("effective group id: %d \n",buffer.msg_perm.gid);
        printf("message queue's creator user id : %d \n",buffer.msg_perm.cuid);
        printf("message queue's creator group id : %d \n",buffer.msg_perm.cgid);
        printf("access mode : %x\n",buffer.msg_perm.mode);

        printf("Maximum number of bytes allowed in message queue : %d \n",buffer.msg_qbytes);
        printf("Current number of bytes in message queue (non-standard) : %d \n",buffer.__msg_cbytes);
        printf("Current number of messages in message queue : %d \n",buffer.msg_qnum);

 return 0;
}

int main(int argc,char* argv[])

 int msqid;

 if(msqid=creat_msg_queue()<0){
  printf("create msg queue fail");
  return -1;
 }

 if(send_msg(msqid,"test message")<0){
  printf("send message fail");
  return -1;
 } 

 if(show_msg_queue_stat(msqid)<0){
  printf("show message queue fail");
  return -1;
 }

 return 0;

原创粉丝点击