linux进程通信—消息队列

  • Post author:
  • Post category:linux




0.相关头文件

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/msg.h>



1.函数原型、相关数据结构

描述:消息队列:IPC之一

内核开辟的一个队列,进程可以通过调用系统API方式调用消息队列函数,给内核消息队列发送或者接收数据((系统调用))

ipcs命令可以查看消息队列,也可以查看共享内存。进程结束消息队列还存在,说明消息队列是由内核维护的

ipcs

  struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
  };
  mtype字段必须具有严格正整数值。此值可由接收器使用——消息选择的初始化过程
int msgget(key_t key, int msgflg);
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);



1.msgget():创建和访问一个消息队列

int msgget(key_t key, int msgflg);

参数:

1:key_t用户指定的要创建的消息队列的名字(一般为整形数字)

2:msgflg权限位:0644,它们的用法和创建文件时使用的mode模式标志是一样的

返回值:

成功:非负整数 失败:-1



2.msgsnd():发送信息,把一条消息添加到消息队列里去

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

参数:

1.msqid:由msgget函数返回的消息队列标识码

2.msgp: 指针,指针指向准备发送的消息的结构体

3.msgsz: msg_sz发送结构体中除long int 的大小,也就是struct msgbuf中的char mtext的大小

4.msgflag: 控制着当前消息队列满或到达系统上限时将要发生的事情

msgflg=IPC_NOWAIT表示队列满不等待,返回EAGAIN错误

返回值:

成功:返回“0”, 失败,则返回“-1”



3.msgrcv():从一个消息队列里检索(接收)消息

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);


参数:


1:msgid: 由msgget函数返回的消息队列标识码

2:msg_ptr:是一个指针,指针指向准备接收的消息,

3:msg_sz发送结构体中除long int 的大小,也就是struct msgbuf中的char mtext的大小

4:msgtype:它可以实现接收优先级的简单形式

一个消息队列可以被很多进程共享,也就是多个进程都可能使用这个消息队列,那么消息如何进行区分?——mtypemtype用来区别不同消息通常是,发送和接收的mtype数字一一对应才可以收到,当mtype==0:接收所有消息如果mtype的值在消息队列中没有对应值且不为0,则接收将堵塞

• msgtype=0返回队列第一条信息

• msgtype>0返回队列第一条类型等于msgtype的消息

• msgtype<0返回队列第一条类型小于等于msgtype绝对值的消息

5:msgflg:控制着队列中没有相应类型的消息可供接收时将要发生的事

• msgflg=IPC_NOWAIT,队列没有可读消息不等待,返回ENOMSG错误。

• msgflg=MSG_NOERROR,消息大小超过msgsz时被截断

• msgtype>0且msgflg=MSC_EXCEPT,接收类型不等于msgtype的第一条消息


返回值



成功:返回实际放到接收缓冲区里去的字符个数returns the number of bytes actually copied into the

mtext array.

失败,则返回“-1”


注意

1.当重复往消息队列里面发送相同时间的时候,消息是不会被阻塞的,每一次发送都有效且相互独立

2.如果消息队列里面没有数据了,再接收也将阻塞,若不想阻塞,可设置msgflg=IPC_NOWAIT,将立刻返回并产生错误IPC_NOWAIT:

Return immediately if no message of the requested type is in the queue. The system call fails with errno set to ENOMSG.

3.最多可以创建256个消息队列

4.发送的每个消息的最大长度是8192字节

5.一个消息队列接收所有消息的最大容量是16384字节,16384/8192==2

https://blog.csdn.net/heli200482128/article/details/113501045

man文档

sun的mq_receive函数的man page

If more than one process (or thread) is waiting to receive a message when a message arrives at an empty queue, then the process of highest priority that has been waiting the longest is selected to receive the message.

mq_send的man page

If more than one thread is waiting to send when space becomes available in the message queue, then the thread of the highest priority which has been waiting the longest is unblocked to send its message. Otherwise, it is unspecified which waiting thread is unblocked. If the specified message queue is full and O_NONBLOCK is set in the message queue description associated with mqdes, the message is not queued and mq_send() returns an error.

结论

看起来从应用层面是不用管理冲突的



版权声明:本文为Wmll1234567原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。