System V 消息队列
消息队列
创建消息队列
#include <sys/types.h>
#include <sys/msg.h>
int msgget( key_t key, int msgflg )
成功返回消息队列的标识符,它是消息队列的句柄。失败返回-1和设置error
参数 key 是一个键,用于生成唯一的标识符。可由 IPC_PRIVATE或 ftok() 生成。
参数 msgflg 是权限位和下面这些位组成:
- IPC_CREAT:没有于指定 key 对应的消息队列,则新建一个
- IPC_EXCL:同时设置了 IPC_CREAT 并且 key 已经存在,那么调用失败返回EEXIST
- 向消息队列写入信息要有写权限 S_IWUSR
对 IPC 对象来说,只有读和写权限有意义,执行权限是没有意义的。
发送消息
#include <sys/types.h>
#include <sys/msg.h>
int msgsnd( int msqid, const void *msgp, size_t msgsz, int msgflg )
成功返回0, 失败返回-1和设置error
参数 msqid 是消息队列的标识符
参数 msgp 是这样一个结构体:
struct mymsg
{
long mtype;
char mtext[]; /*需要发送的消息*/
}
参数 msgsz 是结构体成员 mtext 的字节数。
参数 msgflg 是一组位掩码:
- IPC_NOWAIT:执行非阻塞的发送操作
- 只定义了一个
接收消息
#include <sys/types.h>
#include <sys/msg.h>
ssize_t msgrcv( int msqid, void *msgp, size_t maxmsgsz, long msgtyp, int msgflg );
参数 msqid 是消息队列的标识符
参数 msgp 是结构体
参数 maxmsgsz 是 msgp 结构体中的 mtext 成员的最大可用空间
参数 msgtyp:
- 等于 0 时,删除消息队列中的第一条消息并将其返回给调用进程
- 大于 0 时,将消息队列第一条 mtype 等于 msgtyp 的消息删除并返回给调用者
- 小于 0 时,将等待消息当成优先队列来处理,队列 mytype 最小并且其值小于或等于 msgtyp 的绝对值的第一条消息会被删除并返回给调用者。
参数 msgflag 是位掩码:
- IPC_NOWAIT:执行一个非阻塞接收
- MSG_EXCEPT:msgtyp大于0时才起作用,将消息队列中第一条 mtype 不等于 msgtyp 的消息删除并将其返回给调用者
- MSG_NOERROR:默认情况 mtext 大小超过了 maxmsgsz ,则会调用失败。指定了该标志则会把 mtext 截断为 maxmsgsz 字节。然后返回给调用者,被截取的数据丢失。
控制操作
#include <sys/types.h>
#include <sys/msg.h>
int msgctl( int msqid, int cmd, struct msqid_ds *buf );
成功返回0, 失败返回-1和设置error
参数 msqid 是消息队列的标识符
参数 cmd 是如下操作:
- IPC_RMID:立即删除消息队列,这个操作忽略第三个参数
- IPC_STAT:将 msqid_ds 的副本放入 buf
- IPC_SET:用 buf 更新 msqid_ds中被选中的字段
示例代码
发送数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#define BUFFER_SIZE 11
struct message
{
long msg_type;
char msg_text[BUFFER_SIZE];
};
int main( void )
{
struct message msg;
msg.msg_type = getpid();
printf("msg.msg_type:%ld\n", msg.msg_type);
strcpy(msg.msg_text, "Hello World");
int qid = msgget( IPC_PRIVATE, IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR );
printf( "qid: %d\n", qid );
msgsnd( qid, &msg, BUFFER_SIZE, 0 );
sleep(30);
msgctl( qid, IPC_RMID, NULL );
exit( EXIT_SUCCESS );
}
接收数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#define BUFFER_SIZE 11
struct mbuf
{
long mtype;
char mtext[BUFFER_SIZE];
};
int main( int argc, char **argv )
{
struct mbuf msg;
msgrcv( atoi(argv[1]), &msg, BUFFER_SIZE, atoi(argv[2]), IPC_NOWAIT );
printf("msg.mtype: %ld\n", msg.mtype);
printf("msg.mtext: %s\n", msg.mtext);
exit( EXIT_SUCCESS );
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!