c/c++语言开发共享c/c++ linux 进程间通信系列6,使用消息队列(message queue)

linux 进程间通信系列6,使用消息队列(message queue) 概念:消息排队,先进先出(FIFO),消息一旦出队,就从队列里消失了。 1,创建消息队列(message queue) 2,写消息到消息队列(message queue) 3,从消息队列(message queue)读消息 3 …


linux 进程间通信系列6,使用消息队列(message queue)

概念:消息排队,先进先出(fifo),消息一旦出队,就从队列里消失了。

1,创建消息队列(message queue)

2,写消息到消息队列(message queue)

3,从消息队列(message queue)读消息

3,删除消息队列(message queue)

1,创建消息队列(message queue)

#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h>  int main(){   int msgid;    msgid = msgget(ipc_private, 0600);   if(msgid < 0){     perror("msgget");     return 1;   }    printf("%dn", msgid);   return 0; } 

用下面的命令,能够查看到上面的程序创建的共享内存。

ipcs -q

执行后的结果:

------ message queues -------- key        msqid      owner      perms      used-bytes   messages     0x00000000 32768      ys         600        0            0      

2,写消息到消息队列(message queue)

#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h>  #define mtextsize 10  int main(int argc, char* argv[]){   int msgid;   struct msgbuf{     long mtype;     char mtext[mtextsize];   }mbuf;    if(argc != 2){     printf("wrong argc");     return 1;   }    msgid = atoi(argv[1]);    mbuf.mtype = 777;   memset(mbuf.mtext, 0, sizeof(mbuf.mtext));   mbuf.mtext[0] = 'a';    if(msgsnd(msgid, &mbuf, mtextsize, 0) != 0){     perror("msgsnd");     return 1;   }    return 0; } 

执行方法:【ipcs -q】执行后,得到下面的数字。

./a.out 789884

执行后:ipcs -q 发现, message下面的数字从0变为1了,说明消息队列里有了一个消息。

------ message queues -------- key        msqid      owner      perms      used-bytes   messages     0x00000000 32768      ys         600        10           1  

3,从消息队列(message queue)读消息

#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h>  #define mtextsize 10  int main(int argc, char* argv[]){   int msgid, msgtype;      struct msgbuf{     long mtype;     char mtext[mtextsize];   }mbuf;    if(argc != 3){     printf("wrong argc");     return 1;   }    msgid = atoi(argv[1]);   msgtype = atoi(argv[2]);    if(msgrcv(msgid, &mbuf, mtextsize, msgtype, 0) <= 0){     perror("msgrcv");     return 1;   }    printf("%cn", mbuf.mtext[0]);   return 0; } 

执行方法:必须指定在写入消息是的type,也就是777

./a.out 32768 777

执行后,ipcs -q发现,message下面的数字,由1变为0了,说明消息队列里没有消息了。

------ message queues -------- key        msqid      owner      perms      used-bytes   messages     0x00000000 32768      ys         600        0            0     

4,删除消息队列(message queue)

#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/msg.h> #include <stdlib.h>  int main(int argc, char* argv[]){   int msgid;   msqid_ds mds;    if(argc != 2){     printf("wrong argvn");     return 1;   }    msgid = atoi(argv[1]);    if(msgctl(msgid, ipc_rmid, &mds) != 0){     perror("msgctl");     return 1;   }    return 0; } 

执行方法:

./a.out 32768

执行后,ipcs -q发现,消息队列本身都没有了。

------ message queues -------- key        msqid      owner      perms      used-bytes   messages 

用命令行删除共享内存:【ipcs -q】执行后,得到下面的数字。

ipcrm -q id

c/c++ 学习互助qq群:877684253

c/c++ linux 进程间通信系列6,使用消息队列(message queue)

本人微信:xiaoshitou5854

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/606786.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐