Linux进程间通信——消息队列

转载 2011年10月13日 09:38:28
消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它
和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了
信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 我们可以用流管道或者套接口的方式来取代它。

查询系统消息队列:ipcs -q

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

int msgget(key_t key, int msgflg);

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);


C代码
  1. /*msgserver.c*/ 
  2.  
  3. #include <stdlib.h> 
  4. #include <string.h> 
  5. #include <errno.h> 
  6. #include <sys/types.h> 
  7. #include <sys/ipc.h> 
  8. #include <sys/msg.h> 
  9. #include <sys/stat.h> 
  10.  
  11. #define   MSG_FILE "msgserver.c"  
  12. #define   BUFFER 255  
  13. #define   PERM S_IRUSR|S_IWUSR  
  14. /* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */ 
  15. /* ipcrm -q <msqid> */ 
  16.  
  17. struct msgtype  
  18. {  
  19.     long mtype;  
  20.     char buffer[BUFFER+1];  
  21. };  
  22.  
  23. int main()  
  24. {  
  25.     struct msgtype msg;  
  26.     key_t key;  
  27.     int msgid;  
  28.      
  29.     if((key=ftok(MSG_FILE,'a'))==-1)  
  30.     {  
  31.         fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));  
  32.         exit(1);  
  33.     }  
  34.  
  35.     if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)  
  36.     { 
  37.         fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));  
  38.         exit(1); 
  39.     }  
  40.     printf("msqid = %d\n", msgid); 
  41.     while(1) 
  42.     {  
  43.         msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);  
  44.         fprintf(stderr,"Server Receive:%s\n", msg.buffer);  
  45.         msg.mtype = 2;  
  46.         msgsnd(msgid, &msg, sizeof(struct msgtype), 0);  
  47.     }  
  48.     exit(0);  
  49. }    
C代码
  1. /* msgclient.c */ 
  2.  
  3. #include <stdio.h> 
  4. #include <stdlib.h> 
  5. #include <string.h> 
  6. #include <errno.h> 
  7. #include <sys/types.h> 
  8. #include <sys/ipc.h> 
  9. #include <sys/msg.h> 
  10. #include <sys/stat.h> 
  11.  
  12. #define   MSG_FILE "msgserver.c"  
  13. #define   BUFFER 255  
  14. #define   PERM S_IRUSR|S_IWUSR  
  15.  
  16. struct msgtype {  
  17.     long mtype;  
  18.     char buffer[BUFFER+1];  
  19. };  
  20.  
  21. int main(int argc, char **argv)  
  22. {  
  23.     struct msgtype msg;  
  24.     key_t key;  
  25.     int msgid;  
  26.      
  27.     if(argc != 2)  
  28.     {  
  29.         fprintf(stderr,"Usage:%s string\n", argv[0]);  
  30.         exit(1);  
  31.     }  
  32.      
  33.     if((key=ftok(MSG_FILE,'a'))==-1)  
  34.     {  
  35.         fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));  
  36.         exit(1);  
  37.     }  
  38.      
  39.     if((msgid=msgget(key, PERM))==-1)  
  40.     {  
  41.         fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));  
  42.         exit(1);  
  43.     }  
  44.      
  45.     msg.mtype = 1;  
  46.     strncpy(msg.buffer, argv[1], BUFFER);  
  47.     msgsnd(msgid, &msg, sizeof(struct msgtype), 0);   
  48.     memset(&msg, '\0'sizeof(struct msgtype));  
  49.     msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);  
  50.     fprintf(stderr, "Client receive:%s\n", msg.buffer);  
  51.     exit(0); 
  52. }   

RabbitMQ

-
  • 1970年01月01日 08:00

Linux进程间通信——消息队列应用实例

    消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能...
  • li_wen01
  • li_wen01
  • 2018-04-24 11:07:45
  • 631

linux消息队列进程间通信

  • 2011年03月17日 23:48
  • 598KB
  • 下载

【Linux进程间通信】 - 消息队列

今天我们来介绍一下如何使用消息队列来进行进程间通信。1、消息队列消息队列是由内核维护的一种链式结构。链表中每一个记录又称作消息,消息具有特定的格式和优先级别。各个进程通过消息队列标识符来引用消息队列,...
  • Xiejingfa
  • Xiejingfa
  • 2016-03-19 15:37:09
  • 1368

linux 进程间通信三 消息队列以及实例

代码来自:嵌入式linux应用开发标准教程 消息可以理解为写信给某个人,这里在应用中是告诉系统写信人和写信的内容就可以了, 别人会来看发信人是谁,如果不是自己想要的就放弃读信或者只要有消息...
  • liang890319
  • liang890319
  • 2012-12-11 09:40:46
  • 5781

Linux系统编程——进程间通信:消息队列

消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法。对于消息队列的操作,我们可以类比为这么一个过程:假如 A 有个东西要给 B,因为某些原因 A 不能当面直接给 B,这时候他们需要借助第...
  • tennysonsky
  • tennysonsky
  • 2015-06-02 20:45:48
  • 89135

进程间通讯的消息队列和共享内存方式的实现

qt,进程间通讯,消息传递模式,共享内存模式
  • zhangxufei
  • zhangxufei
  • 2016-02-18 15:29:23
  • 2244

Linux 进程间通信——消息队列实现双向通信

函数: key_t ftok(const char *filename, int proj_id); 通过文件名和项目号获得System V IPC键值(用于创建消息队列、共享内存所用) proj...
  • Acceptedxukai
  • Acceptedxukai
  • 2012-12-21 19:37:37
  • 4958

Linux——基于共享内存 消息队列和基于Socket的进程间的通信

一.基于内存的通信     0.一组内核内存的工具         ipcs           ipcs -m 共享内存         ipcs -q 共享队列         ipcs -s  ...
  • u012409883
  • u012409883
  • 2014-09-16 19:58:30
  • 1814

linux进程间通信-----System V消息队列总结实例

linux进程间通信-----消息队列总结实例
  • Linux_ever
  • Linux_ever
  • 2015-12-17 21:29:28
  • 1525
收藏助手
不良信息举报
您举报文章:Linux进程间通信——消息队列
举报原因:
原因补充:

(最多只允许输入30个字)