zoukankan      html  css  js  c++  java
  • 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
    ",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
    ",info.msg_qnum);
        msgrcv(msgid,(void *)&rec_msg,sizeof(rec_msg)+1,100,IPC_NOWAIT);
        if(rec_msg.buff!=NULL){
            printf("收到的信息为:%s
    ",rec_msg.buff);
        }
        else{
            printf("接收信息失败
    ");
        }
        msgctl(msgid,IPC_STAT,&info);
        printf("接收信息后:消息的个数 =%lu
    ",info.msg_qnum);
        msgctl(msgid,IPC_RMID,NULL);
        return EXIT_SUCCESS;
    }

    4,运行结果:

    发送信息前:消息的个数 =0
    发送信息后:消息的个数 =1
    收到的信息为:I'm a test
    接收信息后:消息的个数 =0
  • 相关阅读:
    Docker启动ubuntu容器中使用sudo后报错,bash: sudo: command not found
    Redis持久化rdb&aof
    Python3中copy模块常用功能及其他几种copy方式比较
    学习笔记:tkinter模块常用参数(python3)
    Python核心编程第二版(中文).pdf 目录整理
    11、487-3279
    10、Crashing Balloon
    9、Exponentiation
    8、Fire Net
    7、Reverse Root
  • 原文地址:https://www.cnblogs.com/sklww/p/3494765.html
Copyright © 2011-2022 走看看