在多进程开发中,C语言消息队列是一种非常重要的进程间通信(IPC)机制。它允许不同进程之间通过“发送”和“接收”消息来交换数据,而无需共享内存或使用复杂的同步机制。本教程将手把手带你了解并实现一个基于Linux系统的C语言消息队列程序,即使你是编程小白也能轻松上手!

消息队列是操作系统提供的一种Linux IPC方式,它本质上是一个链表,存放在内核中,并由消息队列标识符(msgqid)唯一标识。每个消息都有一个类型字段,接收者可以根据类型选择性地读取消息。
与管道、信号量等其他IPC机制相比,消息队列具有以下优点:
在Linux中,我们主要使用以下系统调用来操作消息队列:
msgget():创建或获取一个消息队列msgsnd():向消息队列发送消息msgrcv():从消息队列接收消息msgctl():控制消息队列(如删除)下面我们将编写两个程序:sender.c(发送消息)和receiver.c(接收消息)。
#ifndef MSG_H#define MSG_H#define MSG_KEY 1234 // 消息队列的键值struct msg_buffer { long msg_type; // 消息类型(必须 > 0) char msg_text[100]; // 消息内容};#endif#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/msg.h>#include <sys/ipc.h>#include "msg.h"int main() { int msgid; struct msg_buffer message; // 创建消息队列 msgid = msgget((key_t)MSG_KEY, 0666 | IPC_CREAT); if (msgid == -1) { perror("msgget failed"); exit(EXIT_FAILURE); } printf("请输入要发送的消息: "); fgets(message.msg_text, sizeof(message.msg_text), stdin); message.msg_type = 1; // 消息类型设为1 // 发送消息 if (msgsnd(msgid, &message, sizeof(message.msg_text), 0) == -1) { perror("msgsnd failed"); exit(EXIT_FAILURE); } printf("消息已发送!\n"); return 0;}#include <stdio.h>#include <stdlib.h>#include <sys/msg.h>#include <sys/ipc.h>#include "msg.h"int main() { int msgid; struct msg_buffer message; // 获取消息队列 msgid = msgget((key_t)MSG_KEY, 0666 | IPC_CREAT); if (msgid == -1) { perror("msgget failed"); exit(EXIT_FAILURE); } // 接收类型为1的消息 if (msgrcv(msgid, &message, sizeof(message.msg_text), 1, 0) == -1) { perror("msgrcv failed"); exit(EXIT_FAILURE); } printf("收到消息: %s", message.msg_text); // 可选:删除消息队列 // msgctl(msgid, IPC_RMID, NULL); return 0;}在终端中执行以下命令:
gcc sender.c -o sendergcc receiver.c -o receiver先运行接收端(让它等待消息):
./receiver再打开另一个终端运行发送端:
./sender输入消息后,接收端会立即打印出来!
msgsnd会失败ipcs -q查看)msgctl(msgid, IPC_RMID, NULL)清理资源通过本教程,你已经掌握了如何在C语言中使用消息队列编程实现进程间通信。这种技术广泛应用于服务器开发、嵌入式系统和分布式任务调度中。建议你动手修改示例代码,尝试多类型消息、错误处理或跨进程聊天程序,以加深理解。
记住,熟练掌握C语言消息队列和Linux IPC机制,是你迈向高级系统编程的重要一步!
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251211611.html