美文网首页
Linux进程间同步和通信3:消息队列

Linux进程间同步和通信3:消息队列

作者: AmberXiao | 来源:发表于2018-06-20 10:25 被阅读0次

目录:
1. 半双工管道
2. 命名管道
3. 消息队列
4. 信号量
5. 信号
6. 共享内存


3 消息队列

3.1 特点

  • 消息队列是内核地址空间中的内部链表,通过内核在进程之间传递内容。
  • 消息顺序的发送到消息队列中,并以不同的方式从队列中获取。


    消息队列工作流程

3.2 基本知识

3.2.1 ftok()函数

ftok()函数用于使用路径名和项目表示符构建一个键值。

#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(
  const char *pathname,  //已经存在的目录
  int proj_id  //8位的值,通常a,b
);

调用成功返回0,失败返回-1.

3.2.2 msgget()函数

创建一个新的消息队列或者访问一个现有的队列。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(
  ket_t key,
  int msgflag
);
  • key:键值,可以用ftok()生成
  • msgflag:
    IPC_CREATE 如果队列不存在则创建一个;
    IPC_EXCL 与IPC_CREATE一起使用时,如果队列已存在则报错。
  • 调用成功返回一个消息队列的标识符,失败返回-1.
3.2.3 msgsnd()&msgrcv()函数

msgsnd()&msgrcv()分别用于向队列传递消息和从队列中接受消息。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(
  int msgid,
  const void *msgp,
  size_t msgsz,
  int msgflg
);
  • msgid:队列标识符,由msgget()返回。
  • msgp:指向消息缓冲区,消息缓冲区的结构如下:
    #include <linux/msg.h>
    struct msgbuf{
      long type;
      char mtext[1];
    };
    
    mytype代表消息类型,以正数表示,由用户自己设定;
    mtext存储消息数据,不一定是char,类型的大小根据需要确定。
  • msgsz:消息大小,以字节为单位,不包括消息类型(type)的大小。
  • msgflg:
    取值为0,表示忽略;
    取值为IPC_NOWAIT时:待验证
  • 成功返回0,失败返回-1.
int msgrcv(
  int msgid,
  void *msgp,
  size_t msgsz,
  long msgtyp,
  int msgflg
);
  • mstyp:指定要从消息队列中获取的消息类型,如果为0则将获得队列中最老的消息。
  • msgflg:待验证
  • 其他参数与msgsnd()相同。
  • 成功返回0,失败返回-1.
3.2.4 msgctl()函数

在消息队列上执行控制操作.

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(
  int msgid,
  int cmd,
  struct msgid_ds *buf
);
  • cmd:内核根据此来判断进行何种操作。IPC_STAT,获取队列的msgid_ds结构,并放置在buf中;IPC_SET,将buf的值赋予msgid_ds的ipc_perm成员;IPC_RMID,内核中删除此队列。

3.3 消息队列例程

相关文章

  • Linux进程间同步和通信3:消息队列

    目录:1. 半双工管道2. 命名管道3. 消息队列4. 信号量5. 信号6. 共享内存 3 消息队列 3.1 特点...

  • 零散的小知识记录(待补充和修改)

    Android跨进程通信:Binder,socket/管道/消息队列,共享内存; linux进程间通信:管道,Bi...

  • Linux进程基础行为(二)

    本节主要讲Linux进程间通信在Linux中,各个进程都共享内核空间,因此LInux进程通信中的管道,消息队列等都...

  • linux 进程间通信手段介绍

    linux进程间支持多种通信机制进行通信、传递消息。常用的包括:管道、共享内存、消息队列、socket。代码参考自...

  • 8.ipc

    进程间通信 Linux中的进程间通信主要有:管道、FIFO、消息队列、信号量、共享存储以及网络IPC中的套接字。 ...

  • Android Framework学习笔记之Binder

    Linux进程间通信的方式:管道(Pipe)、信号(Signal)、消息队列(Message)、共享内存(Shar...

  • [Linux进程间通信]消息队列

    消息队列是消息的链接表,存放在内核中并由消息队列标识符标识每条消息由3部分组成:消息类型+消息长度+实际数据每条新...

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

    msggetmsgctlmsgsndmsgrcv 参考:https://blog.csdn.net/wei_che...

  • linux c/c++面试知识点整理(五)

    41、linux系统进程间有哪些通信方式 管道、有名管道、消息队列、信号、共享内存、socket、文件 ...

  • Linux

    操作系统 Linux进程间通信方式:Socket、共享内存、消息队列、信号量 epoll、select、poll ...

网友评论

      本文标题:Linux进程间同步和通信3:消息队列

      本文链接:https://www.haomeiwen.com/subject/obptyftx.html