消息队列

System V IPC:

  Unix系统存在信号、管道等基本的进程间的通信机制;

  System V引入了三种高级的进程通信机制:

    消息队列、共享内存、信号量

  IPC对象(消息队列、共享内存、信号量)在于内核中而不是文件系统中(虽然管道也是在内核中,但是它的释放由内核控制),由用户控制释放(即用户管理IPC对象的生命周   期),不像管道由内核控制。

  IPC对象通过其标识符来引用和访问,所有的IPC对象在内核中有唯一的标识ID,在用户空间有唯一的标识key

  linux IPC继承System V

 

  IPC对象是全局对象(即如果不手动的去释放将一直在内核中);

    可用ipcs、ipcrm等命令查看或删除

  每个IPC对象都有get函数创建

    msgget(消息队列)、shmget(共享内存)、semget(信号量)

  get函数中的参数要指定唯一的标识key

 

IPC对象的权限和所有者结构体

  

消息队列

  消息队列是内核中的一个链表(一个消息队列中可以有多个消息,每个消息都有类型(mtype));

  允许一个或多个进程往消息队列中写消息,但一个消息只能被一个进程读取,这个消息在读取完后就自动删除;

  每一个消息队列在内核中用一个唯一的IPC标识ID表示;

 

消息队列的属性:

  

 

消息队列的打开和创建:

  int msgget(key_t key,int flag)

  成功返回内核中消息队列的标识ID,失败返回-1

  参数:

    key:用户空间的唯一标识key;

    flag:IPC_CREAT_IPC_EXCL等

  若要创建消息队列,key可指定键值,也可将之设为IPC_PRIVATE。若打开进行查询,key必须为一个非零的值,否则是查询不到的

 

消息队列的控制:

  int msgctl(int msgqid,int cmd,struct msqid_ds *buf)

  成功返回0,失败返回-1

  参数:

    msgid:消息队列id

    buf:消息队列属性指针

    cmd:

      

 

 

 

消息发送到消息队列:

  ssize_t msgsnd(int msgqid,const void *ptr,size_t nbytes,int flag)

  成功返回0,失败-1

  参数:

    msgqid:消息队列id

    ptr:

      struct mymesg{

        long mtype;//消息的类型,是一个整数且大于0

        char mtex[512];//消息数据本身,是第三个参数的内容

      }

    nbytes:消息的大小,不包括mtype的长度

    flag:

      0:阻塞(消息队列中装满消息);

      IPC_NOWAIT:类似文件IO的非阻塞io标志;

      如果指定为IPC_NOWAIT,当队列已满,msgsnd立即出错返回EAGAIN;

      如果指定为0,调用msgsnd的进程阻塞直到有空间可以容纳要发送的消息,或则删除这个消息队列,或则这个进程捕捉到一个信号,并从信号处理函数返回

 

从消息队列中接受消息:

  ssize_t msgrcv(int msgqid,void *ptr,size_t nbytes,long type,int flag)

  成功返回消息的数据部分长度,失败-1

  参数:

    msgqid:消息队列id

    ptr:指向存放消息的指针

    nbytes:消息缓存的大小,不包括吧mtype的大小。nbytes=sizeif(struct mymesg)-sizeof(long)

    type:消息类型

      

    flag:0或IPC_NOWAIT      

posted @ 2023-03-05 21:56  踏浪而来的人  阅读(122)  评论(0编辑  收藏  举报