1. 消息队列基础与实战
在Linux系统编程中,进程间通信(IPC)是核心课题之一。System V消息队列作为传统IPC三大件之一(另外两个是共享内存和信号量),它允许无关进程通过消息链表进行结构化数据交换。与管道相比,消息队列具有以下显著优势:
- 消息类型标识:每个消息附带整数类型字段,支持优先级处理
- 异步通信:发送方和接收方不需要同时存在
- 持久化:消息会一直保留在队列中直到被显式读取
- 容量优势:系统级队列不受进程生命周期影响
1.1 关键数据结构解析
消息队列的核心是msqid_ds结构体,它由内核维护:
c复制struct msqid_ds {
struct ipc_perm msg_perm; // 权限结构
time_t msg_stime; // 最后发送时间
time_t msg_rtime; // 最后接收时间
time_t msg_ctime; // 最后修改时间
unsigned long __msg_cbytes;
msgqnum_t msg_qnum; // 当前队列消息数
msglen_t msg_qbytes; // 队列最大字节数
pid_t msg_lspid; // 最后发送进程PID
pid_t msg_lrpid; // 最后接收进程PID
};
消息体通常自定义,但必须包含固定头部:
c复制struct mymsg {
long mtype; // 必须作为第一个字段
char mtext[1]; // 柔性数组,实际长度可变
};
1.2 核心API实战
创建/获取消息队列:
c复制int msgget(key_t key, int msgflg);
key:建议用ftok()生成,也可用IPC_PRIVATEmsgflg:权限位(如0666)组合IPC_CREAT等标志- 返回值:成功返回队列ID,失败-1
发送消息示例:
c复制struct msg_buf {
long mtype;
