首先创建消息队列并获取标识符,再定义含mtype的消息结构,使用msgsnd发送数据,最后通过msgrcv按类型接收消息。

在Linux系统中,消息队列是一种重要的进程间通信(IPC)机制,允许不同进程通过内核维护的消息链表发送和接收数据。相比管道,消息队列具有异步通信、支持多进程访问、可按类型接收等优势。以下是使用Linux消息队列进行IPC开发的具体步骤。
创建或打开消息队列
使用 msgget() 函数来获取一个消息队列的标识符。该函数需要一个键值(key_t)和权限标志。
通常使用 ftok() 生成一个唯一的键,再调用 msgget() 创建或访问队列:
key_t key = ftok("/tmp", 'A'); // 生成唯一键
int msqid = msgget(key, 0666 | IPC_CREAT); // 创建或打开队列
如果队列已存在,则直接返回其ID;否则创建新的消息队列。
定义消息结构并发送消息
消息必须遵循特定结构:第一个成员为 long 类型的 mtype,表示消息类型,其余部分为消息内容。
例如:
struct msgbuf {
long mtype;
char mtext[256];
};
使用 msgsnd() 发送消息:
struct msgbuf msg; msg.mtype = 1; strcpy(msg.mtext, "Hello from sender"); msgsnd(msqid, &msg, strlen(msg.mtext)+1, 0);
第三个参数是消息正文的字节数(不含 mtype),第四个参数控制阻塞行为。
接收指定类型的消息
使用 msgrcv() 函数从队列中读取消息。可以指定接收的消息类型:
- 若 mtype > 0:接收第一个类型为 mtype 的消息
- 若 mtype = 0:接收队列中第一个消息(忽略类型)
- 若 mtype
示例:
struct msgbuf msg;
msgrcv(msqid, &msg, 256, 1, 0); // 接收类型为1的消息
printf("Received: %s\n", msg.mtext);
控制与删除消息队列
使用 msgctl() 对消息队列进行控制操作,如获取状态、设置属性或删除队列。
删除队列示例:
msgctl(msqid, IPC_RMID, NULL); // 标记删除队列
注意:只有当所有进程都关闭对该队列的引用后,队列才会真正被释放。
基本上就这些。掌握 msgget、msgsnd、msgrcv 和 msgctl 四个核心函数,就能实现可靠的进程间消息传递。不复杂但容易忽略的是消息类型的设计和资源清理。开发时建议配合 perror() 处理错误,并在程序结束前调用 msgctl 清理资源。










