原理
代码
消息结构
struct msgbuf
{
long mtype;//消息类型,必须大于0
char mtext[1];//消息数据
};
头文件
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
创建消息队列
int msgget(key_t key,int msqflg);
//int mssget((key_t)1234,IPC_CREAT|0600);
msgget()床创建或者获取一个消息队列
msgget()成功返回消息队列ID,失败返回-1
msqflg:IPC_CREAT
发送一条消息
msgsnd(int msgid,const void* msgsz,size_t msgsz,int msgflg);
msgsnd()成功返回0,失败返回-1
msgsz:指定mtext中有效数据的长度
msgflg:一般设置为0,可以设置为IPC_NOWAIT
接收一条消息
ssize_t msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
msgrcv()接收一条消息
msgrcv()成功返回 mtext 中接收到的数据长度, 失败返回-1
msgtyp: 指定接收的消息类型,类型可以为 0
msgflg: 一般设置为 0 可以设置 IPC_NOWAIT
size_t msgsz:接收消息的长度
控制消息队列
int msgctl(int msgid, int cmd, struct msgid_ds *buf);
msgctl()控制消息队列
msgctl()成功返回 0,失败返回-1
cmd: IPC_RMID
发送消息
接收消息
注意:在读取消息时,若是没有0号类型的消息,则0号消息表示可以随机读取任意类型的消息
面试
- 进程间通信的方式有哪些?
管道、信号量、共享内存、消息队列、套接字
- 共享内存的原理
共享内存为多个进程之间共享和传递数据提供了一种有效的方式。共享内存是先在物理内存上申请一块空间,多个进程可以将其映射到自己的虚拟地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由 malloc 分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。由于它并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。
共享内存不存在进程间的拷贝操作。