0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

消息队列实现进程间通讯

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-29 16:52 次阅读

创建消息队列

消息队列的创建,需要用到msgget函数。

int msgget(key_t key, int msgflg);

key:该参数是消息队列的唯一标识,由ftok生成。
msgflg:取值有以下几个选择:IPC_CREAT、IPC_EXCL ,这两个参数详细的作用可以man msgflg看详细介绍。

返回值:返回一个近乎唯一的Message queue id

我们可以指定一个文件,调用ftok ,它会根据这个文件的 inode,生成一个近乎唯一的 key。

key_t ftok(const char *pathname, int proj_id);


pathname:文件信息,必须指定在一个存在的,可访问的文件。
proj_id:8bit的数据,0-255随意设定。

这样就可以获得一个近乎唯一的key了!

只要在这个消息队列的生命周期内,这个文件不要被删除就可以了。只要不删除,无论什么时刻,再调用 ftok,也会得到同样的 key。

综上,创建一个消息队列只需两步:

①:ftok生成一个key

②:msgget生成一个消息队列的ID

如下:

int main() {
  int messagequeueid;
  key_t key;
 
 
  if((key = ftok("/root/messagequeue/messagequeuekey", 1)) < 0)
  {
      perror("ftok error");
      exit(1);
  }
 
 
  printf("Message Queue key: %d.n", key);
 
 
  if ((messagequeueid = msgget(key, IPC_CREAT|0777)) == -1)
  {
      perror("msgget error");
      exit(1);
  }
 
 
  printf("Message queue id: %d.n", messagequeueid);
}

ftok要指定一个存在的文件,所以我们在执行之前,需要创建该文件。
查看消息队列:

System V IPC 体系有一个统一的命令行工具:ipcmk,ipcs 和 ipcrm 用于创建、查看和删除 IPC 对象。

查看创建的IPC对象:ipcs -q
dong@ubuntu:~//Interprocess_Communication$ ipcs
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x01110005 0          dong       777        0            0          
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
------ Semaphore Arrays --------
key        semid      owner      perms      nsems

发送消息
消息队列发送消息,主要调用msgsnd 函数。


int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
msqid:该参数是msgget所得到的message queue 的 id
msgp:消息结构体
struct msg_buffer {
   long mtype;
   char mtext[1024];
};


msgsz:表示消息结构体中,mtext最大长度。
msgflg:一位掩码,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值说明可见man msgsnd
接收消息
消息队列接收消息,主要调用msgrcv 函数。
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msqid:该参数是msgget所得到的message queue 的 id
msgp:消息结构体

msgsz:可接收数据最大长度

msgflg:一位掩码,可取值有:IPC_NOWAIT、MSG_COPY、MSG_EXCEPT、MSG_NOERROR,取值说明可见man msgsnd
有了消息这种模型,两个进程之间的通信就像咱们平时发邮件一样,你来一封,我回一封,可以频繁沟通了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5081

    文章

    19069

    浏览量

    304289
  • 队列
    +关注

    关注

    1

    文章

    46

    浏览量

    10889
  • 进程
    +关注

    关注

    0

    文章

    202

    浏览量

    13956
收藏 人收藏

    评论

    相关推荐

    Linux下进程通讯消息队列

    进行通信。 消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程队列里面写信息,多个进程
    的头像 发表于 08-19 19:56 1800次阅读
    Linux下<b class='flag-5'>进程</b><b class='flag-5'>通讯</b>消息<b class='flag-5'>队列</b>

    基于队列函数实现并行循环传输数据

    数据经过入队列和出队列两个函数过程得到传递,本程序使用队列函数,实现两个并行循环的数据传递。循环 1生成的数据通过
    发表于 04-23 09:40

    鸿蒙内核源码分析(调度队列篇):进程和Task的就绪队列对调度的作用

    为何单独讲调度队列?鸿蒙内核代码中有两个源文件是关于队列的,一个是用于调度的队列,另一个是用于线程通讯的IPC
    发表于 11-23 11:09

    Linux现有的所有进程IPC方式

    在开始回答前,先简单概括性地说说Linux现有的所有进程IPC方式:1. **管道:**在创建时分配一个page大小的内存,缓存区大小比较有限;2. 消息队列:信息复制两次,额外的CPU消耗
    发表于 08-20 06:17

    怎样通过匿名管道去实现进程的通信呢

    进程通信是指什么?怎样通过匿名管道去实现进程的通信呢?有哪些步骤?
    发表于 12-24 06:45

    哪些方式可以实现Linux系统下的进程通信

    哪些方式可以实现Linux系统下的进程通信?进程与线程有哪些不同之处呢?
    发表于 12-24 06:38

    OpenHarmony进程是如何传递大数据的

    (OsQueueDbgInitHook() != LOS_OK) {//调试队列使用的.return LOS_ERRNO_QUEUE_NO_MEMORY;}return LOS_OK;}总结:消息队列解决任务大数据的传递,以
    发表于 05-23 17:13

    RT-thread内核之进程通信设计实现

    1、RT-thread内核之进程通信特性及使用场合介绍  rt-thread操作系统的IPC(Inter-ProcessCommunication,进程同步与通信)包含有中断锁、调
    发表于 09-01 15:13

    进程与线程的通信方式

    进程的通信则不同,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的
    的头像 发表于 04-09 15:58 8912次阅读
    <b class='flag-5'>进程</b><b class='flag-5'>间</b>与线程<b class='flag-5'>间</b>的通信方式

    使用MQTT作为进程通信的方式

    小编对Linux这一块的实际开发经验虽然还不是很足,但也知道进程通信有那么几种方式:管道、消息队列、共享内存、套接字等。
    的头像 发表于 10-22 12:09 6136次阅读
    使用MQTT作为<b class='flag-5'>进程</b><b class='flag-5'>间</b>通信的方式

    鸿蒙内核源码分析:进程和Task的就绪队列对调度的作用

    鸿蒙内核代码中有两个源文件是关于队列的,一个是用于调度的队列,另一个是用于线程通讯的IPC队列。 鸿蒙内核
    发表于 11-23 15:48 31次下载
    鸿蒙内核源码分析:<b class='flag-5'>进程</b>和Task的就绪<b class='flag-5'>队列</b>对调度的作用

    常见的进程通信方式

    关系的进程间使用。进程的亲缘关系,通常指父子进程关系。 有名管道: 有名管道也是,半双工的通信方式,但是它允许无亲缘关系进程
    的头像 发表于 10-08 15:48 1321次阅读
    常见的<b class='flag-5'>进程</b><b class='flag-5'>间</b>通信方式

    进程通信方式总结

    进程通信(IPC): 进程通信的方式有很多,这里主要讲到进程通信的六种方式,分别为:管道、
    的头像 发表于 11-09 09:25 728次阅读
    <b class='flag-5'>进程</b><b class='flag-5'>间</b>通信方式总结

    如何实现一套linux进程通信的机制

    我们知道linux的进程通信的组件有管道,消息队列,socket, 信号量,共享内存等。但是我们如果自己实现一套进程
    的头像 发表于 11-10 14:56 623次阅读
    如何<b class='flag-5'>实现</b>一套linux<b class='flag-5'>进程</b><b class='flag-5'>间</b>通信的机制

    进程通信的消息队列介绍

    消息队列是一种非常常见的进程通信方式。
    的头像 发表于 04-08 17:27 302次阅读