国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 中消息隊列函數(shù)實例詳解

2020-01-26 14:05:25
字體:
供稿:網(wǎng)友

C++ 中消息隊列函數(shù)實例詳解

1.消息隊列結(jié)構(gòu)體的定義

typedef struct{    uid_t  uid;  /* owner`s user id */    gid_t  gid;  /* owner`s group id */    udi_t  cuid;  /* creator`s user id */    gid_t  cgid;  /* creator`s group id */    mode_t mode;  /* read-write permissions 0400 MSG_R 0200 MSG_W*/    ulong_t seq;  /* slot usage sequence number*/}ipc_perm;typedef stuct{    struct ipc_perm msg_perm;   /* read_write perms */    struct msg   *msg_first;   /* ptr to first message on queue */    struct msg   *msg_last;   /* ptr to last message on queue */    msglen_t     msg_cbytes;   /* used bytes current on queue */    msgqnum_t    msg_qnum;    /* current num of message on queue */    msglen_t    msg_qbytes;   /* max # of bytes allowed on queue */    pid_t        msg_lspid;   /* pid of last msgsnd() */    pid_t        msg_lrpid;   /* pid of last msgrcv() */    time_t       msg_stime;   /* time of last msgsnd() */    time_t       msg_rtime;   /* time of last msgrcv() */    time_t       msg_ctime;   /* time of last msgctl() */}msqid_ds;typedef struct{    long mtype;    char mbuf[MSGLEN];}Message;

2.創(chuàng)建消息隊列:

   /***************************************************Function:    int msgget(ket_t key,int oflag);Explain:    create or view a message queueReturn :    a int indetifyInclude:    sys/msg.hintroduction:    oflag: 0400 msg_r         0200 msg_w        0600 msg_wr    ipc_creat: NO exist and then creat a queue          exist : reference a queue    ipc_creat|ipc_excl: NO exist and then creat a queue              exist : return error****************************************************/#include<stdio.h>#include<sys/msg.h>#include<stdlib.h>int MsgGet(int key){    int ret;    ret=msgget(key,0600|IPC_CREAT);//   ret=msgget(key,0600|IPC_CREAT|IPC_EXCL);    if(ret<0)        perror("creat msgid error");    printf("msgid=%d/n",ret);    system("ipcs -q -i ret");    return ret;}int main(int argc,char *agrv[]){    int key;    printf("pleasse input msgkey:");    scanf("%d",&key);    MsgGet(key);    return 0;}

3.向消息隊列中發(fā)送消息msgsnd

/***********************************************************************************Function:    int msgsnd(int msqid,const void *ptr,size_t length,int flag)Explain:    send a message to a queueReturn:    len: send message len;Include:    sys/msg.hIntroduction:    flag: 0 : if queue full wait:1>具備存放新消息的空間                   2>由msqid標(biāo)識的消息隊列從系統(tǒng)中刪除(返回EIDRM錯誤)                   3>調(diào)用線程被某個捕獲的信號所中斷(返回EINTR錯誤)       IPC_NOWAIT:如果沒有存放新消息的空間,函數(shù)馬上返回                   1>指定的隊列中有太多的字節(jié)                   2>在系統(tǒng)范圍存在太多的消息*****************************************************************************************/#include "typemsg.h"int MsgSnd(int msqid,char *buf,int len,int flag){    int ret;    ret=msgsnd(msqid,buf,len,flag);    if(ret<0)        perror("msgsnd error");    system("ipcs -q");    return ret;}int main(){    int msqid,len,stype;    Message msgb;    memset(&msgb,0,sizeof(Message));    printf("msgsnd:please input msqid:");    scanf("%d",&msqid);    printf("please input msgtype:");    scanf("%d",&stype);    msgb.mtype=stype;    strcpy(msgb.mbuf,"zhangweia");    MsgSnd(msqid,(char *)&msgb,sizeof(Message),0);    return 0;}

4.從隊列中獲取消息 msgrcv

/*********************************************************************Function:    int msgrcv(int msqid,const void *ptr,size_t msglen,long type,int flag)Explain:    recv message order by type     msgrcv error: Argument list too long --> msglen的長度小于消息體中消息的長度Para :    ptr: point to message struct     msglen: 由ptr指向的緩沖區(qū)中數(shù)據(jù)部分的大小,這個是該函數(shù)能夠返回的最大數(shù)據(jù)量    type: message type;              1> 0:返回隊列中最早的消息              2> 大于0:返回消息隊列中類型為type的第一個消息              3> 小于0:返回消息隊列中類型小于或者等于type的絕對值的消息類型中最小的第一個消息    flag: 0<wait> 沒有消息或者消息類型不符合的時候,線程等待         響應(yīng): 1>有一個所請求類型的消息可以獲取            2>msqid的消息隊列被系統(tǒng)刪除,返回一個EIDRM            3>調(diào)用線程被某個捕獲的信號所中斷       IPC_NOWAIT:在沒有數(shù)據(jù)的情況下,立即返回一個ENOMSG錯誤       MSGNOERROR:當(dāng)所接受的消息數(shù)據(jù)部分大于msglen長度時,獲取截短的數(shù)據(jù)部分,否則返回E2BIG錯誤Return:    message len*********************************************************************/#include "typemsg.h"int MsgRcv(int msqid,char *buf,int msglen,long type,int flag){    int ret;    ret=msgrcv(msqid,buf,msglen,type,flag);    if(ret<0)    perror("msgrcv error");    system("ipcs -q");    return ret;}int main(){    int msqid,len;    long ttype;    Message mbuf;    printf("msgrcv:please input recv msqid:");    scanf("%d",&msqid);    MsgRcv(msqid,(char *)&mbuf,8900,0,IPC_NOWAIT);    printf("recv message=%s/n",mbuf.mbuf);    Put_String((unsigned char *)&mbuf,sizeof(Message));    return 0;}

6.消息隊列的控制msgctl

/**********************************************************Function:    int msgctl(int msqid,int cmd,struct msqid_ds *buff)Explain:    cdm: IPC_RMID; delete msqid        IPC_SET:        IPC_STAT: return msqid stat*********************************************************/#include "typemsg.h"int MsgCtl(int msqid,int cmd,struct msqid_ds *buff){    int ret;    ret=msgctl(msqid,cmd,buff);    if(ret<0)    {        perror("msgctl error");        return -1;    }    return 0;}int main(){    int msqid,type;    struct msqid_ds info;    printf("please input msqid /nand type(1:icp_rmid;2:ipc_stat)");    scanf("%d%d",&msqid,&type);    if(type==1)    {        MsgCtl(msqid,IPC_RMID,NULL);        printf("delete queue success:%d/n",msqid);    }else if(type==2)    {        MsgCtl(msqid,IPC_STAT,&info);        printf("get queue stat:%d/n",msqid);    }    return 0;}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 调兵山市| 鹿邑县| 罗定市| 刚察县| 行唐县| 新津县| 沙坪坝区| 那曲县| 扎鲁特旗| 丁青县| 房山区| 视频| 阳城县| 汽车| 绥阳县| 蕉岭县| 嘉鱼县| 陆良县| 通许县| 永安市| 腾冲县| 海淀区| 达州市| 文成县| 定兴县| 自贡市| 克东县| 兰溪市| 太和县| 嘉祥县| 铜山县| 莲花县| 罗源县| 资兴市| 布拖县| 翼城县| 汝城县| 海晏县| 泾源县| 柳林县| 长春市|