zoukankan      html  css  js  c++  java
  • linux msg queue 基础操作

    #include <sys/types.h>
    #include <sys/msg.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdio.h>
    
    void msg_stat(int,struct msqid_ds );
    int main()
    {
        int gflags,sflags,rflags;
        key_t key;
        int msgid;
        int reval;
        struct msgsbuf{
            int mtype;
            char mtext[1];
        }msg_sbuf;
        struct msgmbuf
        {
            int mtype;
            char mtext[10];
        }msg_rbuf;
        struct msqid_ds msg_ginfo,msg_sinfo;
        char* msgpath="/unix/msgqueue";
        key=ftok(msgpath,'a');
        gflags=IPC_CREAT|IPC_EXCL;
        msgid=msgget(key,gflags|00666);
        if(msgid==-1)
        {
            printf("msg create error\n");
            return;
        }
        /*创建一个消息队列后,输出消息队列缺省属性*/
        msg_stat(msgid,msg_ginfo);
        sflags=IPC_NOWAIT;
        msg_sbuf.mtype=10;
        msg_sbuf.mtext[0]='a';
        reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
        if(reval==-1)
        {
            printf("message send error\n");
        }
        /*发送一个消息后,输出消息队列属性*/
        msg_stat(msgid,msg_ginfo);
        rflags=IPC_NOWAIT|MSG_NOERROR;
        reval=msgrcv(msgid,&msg_rbuf,4,10,rflags);
        if(reval==-1)
            printf("read msg error\n");
        else
            printf("read from msg queue %d bytes\n",reval);
        /*从消息队列中读出消息后,输出消息队列属性*/
        msg_stat(msgid,msg_ginfo);
        msg_sinfo.msg_perm.uid=8;/*just a try
                                   msg_sinfo.msg_perm.gid=8;/*
                                   msg_sinfo.msg_qbytes=16388;
                                   /*此处验证超级用户可以更改消息队列的缺省msg_qbytes*/
        /*注意这里设置的值大于缺省值*/
        reval=msgctl(msgid,IPC_SET,&msg_sinfo);
        if(reval==-1)
        {
            printf("msg set info error\n");
            return;
        }
        msg_stat(msgid,msg_ginfo);
        /*验证设置消息队列属性*/
        reval=msgctl(msgid,IPC_RMID,NULL);/*删除消息队列*/
        if(reval==-1)
        {
            printf("unlink msg queue error\n");
            return;
        }
    }
    void msg_stat(int msgid,struct msqid_ds msg_info)
    {
        int reval;
        sleep(1);/*只是为了后面输出时间的方便*/
        reval=msgctl(msgid,IPC_STAT,&msg_info);
        if(reval==-1)
        {
            printf("get msg info error\n");
            return;
        }
        printf("\n");
        printf("current number of bytes on queue is %d\n",msg_info.msg_cbytes);
        printf("number of messages in queue is %d\n",msg_info.msg_qnum);
        printf("max number of bytes on queue is %d\n",msg_info.msg_qbytes);
        /*每个消息队列的容量(字节数)都有限制MSGMNB,值的大小因系统而异。在创建新的消息队列时,msg_qbytes的缺省值就是MSGMNB*/
        printf("pid of last msgsnd is %d\n",msg_info.msg_lspid);
        printf("pid of last msgrcv is %d\n",msg_info.msg_lrpid);
        printf("last msgsnd time is %s", ctime(&(msg_info.msg_stime)));
        printf("last msgrcv time is %s", ctime(&(msg_info.msg_rtime)));
        printf("last change time is %s", ctime(&(msg_info.msg_ctime)));
        printf("msg uid is %d\n",msg_info.msg_perm.uid);
        printf("msg gid is %d\n",msg_info.msg_perm.gid);
    }
  • 相关阅读:
    什么是看板方法?
    瓶颈法则
    累积流图——你还没有用过吗?
    为什么我们关注看板方法?
    蒟蒻报道
    博客更换通知
    浅谈树套树(线段树套平衡树)&学习笔记
    浅谈FFT(快速博立叶变换)&学习笔记
    题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】
    题解 洛谷P4550/BZOJ1426 【收集邮票】
  • 原文地址:https://www.cnblogs.com/xianqingzh/p/1932984.html
Copyright © 2011-2022 走看看