消息队列实现接收发送的例子

msg消息队列,实线不同进程之间的通信,主要依靠key来识别:

发送端

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <sys/types.h>
 5 #include <sys/msg.h>
 6 #include <unistd.h>
 7 #include <time.h>
 8 #include <sys/ipc.h>
 9 struct msgmbuf{
10     int mtype;
11     char mtext[40];
12 };
13
14 int main()
15 {
16     int ret = -1;
17     int msg_flags,msg_id;
18     key_t key;
19     struct msqid_ds msg_info;
20     struct msgmbuf msg_mbuf;
21     key = 1024;
22     msg_flags = IPC_CREAT;
23
24     while(1)
25     {
26         msg_id = msgget(key,msg_flags|0666);
27         if(-1==msg_id)
28         {
29             printf("create message failed!\n");
30             return 0;
31         }
32         printf("Input message to send:");
33         scanf("%s",msg_mbuf.mtext);
34         getchar();
35         msg_mbuf.mtype = 10;
36         ret = msgsnd(msg_id,&msg_mbuf,sizeof(struct msgmbuf),0);
37         if(-1==ret)
38         {
39             printf("send message failed!\n");
40         }
41
42     }
43     return 0;
44 }

接收端:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <sys/types.h>
 5 #include <sys/msg.h>
 6 #include <unistd.h>
 7 #include <time.h>
 8 #include <sys/ipc.h>
 9 struct msgmbuf{
10         int mtype;
11         char mtext[40];
12     };
13
14 int main()
15 {
16     int ret = -1;
17     int msg_flags,msg_id;
18     key_t key;
19     struct msgmbuf msg_mbuf;
20     key =1024;
21     msg_flags = IPC_CREAT;
22     while(1)
23     {
24         msg_id = msgget(key,msg_flags|0666);
25         if(-1==msg_id)
26         {
27             printf("create message failed!\n");
28             return 0;
29         }
30
31         ret = msgrcv(msg_id,&msg_mbuf,sizeof(struct msgmbuf),0,0);
32         if(-1==ret)
33         {
34             printf("receive message failed!\n");
35         }
36         else
37         {
38             printf("receive message successful!message[%s]\n",msg_mbuf.mtext);
39         }
40
41     }
42     return 0;
43 }
时间: 2024-10-17 08:58:15

消息队列实现接收发送的例子的相关文章

ucos-iii串口用信号量及环形队列中断发送,用内建消息队列中断接收

串口发送部分代码: //通过信号量的方法发送数据 void usart1SendData(CPU_INT08U ch) { OS_ERR err; CPU_INT08U isTheFirstCh; OSSemPend(&Usart1Sem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻塞型等待串口发送资源 OSSemPend(&Usart1TxBufSem, 0, OS_OPT_PEND_BLOCKING, NULL, &err);//阻

启动任务StartTask() 发送完消息队列 自己删除,接收方一直显示数据 用OSQFlush(Str_Q); //清空消息队列 下面纠结接收不到了 哈哈

在建立工程的时候,启动任务StartTask()  启动了任务MyTask(),也建立了消息队列,然后发送消息队列,发送完自己删除了自己,在接收方一直能接受到数据???为何??? 因为我们的消息队列未清空,消息队列里面一直有数据呢,当然在执行MyTask  的任务的时候, MyTask 里面有这句等待消息队列的语句ss=OSQPend(Str_Q,0,&err);      //请求消息队列,如果在任务MyTask  里面我们清除消息队列嫩?啊是不是就没有数据接收了???果不其然,,,清空后 啥

Linux进程间通信 -- 消息队列 msgget()、msgsend()、msgrcv()、msgctl()

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信 -- 使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条

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

消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下: 1)消息队列可以实现消息的随机查询.消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取. 2)消息队列允许一个或多个进程向它写入或者读取消息. 3)与无名管道.命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除. 4)每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的. 5)消息队列是消息的链表,存放在内存中,由内核维护.只有内核重启或人工删除消息队列时,该消息队列才会被删

linux_c 开发(5-5)进程间通讯_消息队列

进程间通讯_消息队列 定义: UNIX早起通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也称报文队列)则克服了这些缺点. 发展: 消息队列就是一个消息的链表.可以把消息看做一个记录,**具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读取消息. 分类: 目前主要有两种类型的消息队列:POSIX消息队列 以及系统V消息队列,系统V消息队列目前被大量使用. 持续性:系统V消息队列是随内核持续的,只有在

IPC——消息队列

Linux进程间通信——使用消息队列 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.消息队列是消息的链接表,存放在内核中并由消息队列标识符标识.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题(命名管道要读端和写端

[转]Linux进程间通信——使用消息队列

点击此处阅读原文 另收藏ljianhui的专栏初学Linux 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的

Linux进程间通信(1)——消息队列

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列 与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消

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

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息