进程间通信(二)----消息队列

本文详细介绍了消息队列的概念、特点及其实现方式。通过讲解消息队列的基本原理、相关接口和使用方法,帮助读者理解消息队列如何实现进程间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,什么是消息队列?消息队列是System V下的IPC通信机制,消息队列提供了一种从一个进程向另一个进程发送一个具有类型的数据块的方法,我们可以通过消息队列避免管道的同步和阻塞问题,但是同管道一样,消息队列也存在长度的限制,每个数据块的大小具有限制,同时每个消息队列的长度也存在限制
对于IPC的通信机制(包括消息队列,共享内存,信号量),内核都为其维护了一个IPC对象数据结构struct ipc_perm:
struct ipc_perm {
     key_t __key; /* Key supplied to xxxget(2) */
     uid_t uid; /* Effective UID of owner */
     gid_t gid; /* Effective GID of owner */
     uid_t cuid; /* Effective UID of creator */
     gid_t cgid; /* Effective GID of creator */
     unsigned short mode; /* Permissions */
     unsigned short __seq; /* Sequence number */
};

而对于描述消息队列自身的结构体:


消息队列的对应接口:
int msgget(key_t,int msgflg);
函数功能:创建新的消息队列或获取已存在的消息队列
参数:第一个参数key由ftok函数生成,第二个参数msgflg有两个宏IPC_CREAT,IPC_EXCL,前者表示若对应消息队列不存在则进行创建,否则获取这个消息队列,后者单独使用的意义不大,与前者同时使用表示若对应消息队列不存在,则创建,否则报错,用于保证所得消息队列是新建的而不是已存在的对象
返回值:返回一个消息队列的标识符,若出错则返回-1

key_t ftok(const char* pathname,int proj_id);用于生成key值

ssize_t msgrcv(int msqid,const void* msgp,size_t msgsz,long msgtyp,int msgflg);
函数功能:从消息队列中读消息
int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg);
函数功能:向消息队列中写消息
参数:msqid表示消息队列的标识码;msgp指向消息缓冲区的指针,用户自定义的结构体(包含字段有long mtype(这个字段的值必须大于0)与char mtext[大小由用户指定]);msgsz表示消息的大小;msgtyp从消息队列中读取消息的形态,若为0则表示消息队列中所有类型(自定义结构体中的mtype字段的值代表类型)消息都会被读取,若不为0,则只能获得同类型的消息;msgflg表示对于消息队列的读写是否进行等待,若为0表示对于消息队列为空进行读取等待,为满则进行写等待

int msgctl(int msgqid,int cmd,struct msqid_ds* buf);
函数功能:设置消息队列属性,对指定消息队列执行cmd操作
参数:cmd可以设为三种操作
IPC_STAT表示获取消息队列中对应的msqid_ds数据结构,并保存在buf中;
IPC_SET表示设置消息队列的属性,而待设置的属性保存在buf中;
IPC_RMID表示从内核中删除指定消息队列

对于消息队列,有两个重要的命令:ipcs -q(用于查看系统中的消息队列);ipcrm -q msqid(用于删除指定消息队列)

对比消息队列和管道,消息队列的特点在于进行数据块通信(消息具有明显的类型块大小);而且可以用于两个不相关的进程间通信;支持同步与互斥机制;对于接收的消息可以进行类型的选择;最重要的是在内核中创建的消息队列可以独立与收发进程而存在,它是由内核维护的,其生命周期不随进程,而且从消息队列中获取消息不一定得先进先出,支持随机访问


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值