多进程间通过消息队列通讯
多进程间通过消息队列通讯简单示例
头文件:proto.h
#ifndef __PROTO_H__
#define __PROTO_H__
#define KEYPATH "/etc/services"
#define KEYID 'a'
#define NAMESIZE 1024
struct student_st //自定义数据结构
{
char name[NAMESIZE];
int math;
int chinese;
};
#endif
发送消息:sender.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include "proto.h"
typedef struct //自定义消息结构体
{
long mtype;
struct student_st stu;
}msg_data;
int main()
{
key_t key;
int queueID,ret;
msg_data data;
key = ftok(KEYPATH,KEYID); //创建key
if(key<0)
{
perror("key");
exit(1);
}
queueID = msgget(key,IPC_CREAT|0666); //获取消息队列ID
if(queueID <0)
{
perror("msgget");
exit(1);
}
data.mtype = 5; //初始化消息体
memcpy(data.stu.name,"Alon",4);
data.stu.math = 100;
data.stu.chinese = 30;
ret = msgsnd(queueID,&data,sizeof(data.stu),IPC_NOWAIT|MSG_NOERROR); //发送消息
if(ret <0)
{
perror("msgrcv()");
exit(1);
}
exit(0); //退出
}
接收消息:rcver.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "proto.h"
typedef struct //自定义消息体
{
long mtype;
struct student_st stu;
}msg_data;
int main()
{
key_t key;
int queueID,ret;
msg_data data;
key = ftok(KEYPATH,KEYID); //创建key
if(key<0)
{
perror("key");
exit(1);
}
queueID = msgget(key,IPC_CREAT|0666); //获取消息ID
if(queueID <0)
{
perror("msgget");
exit(1);
}
ret = msgrcv(queueID,&data,sizeof(data.stu),5,IPC_NOWAIT|MSG_NOERROR); //读取消息队列中的消息
if(ret <0)
{
perror("msgrcv()");
exit(1);
}
printf("name:%s math:%d chinese:%d\n",data.stu.name,data.stu.math,data.stu.chinese); //输出消息
ret = msgctl(queueID,IPC_RMID,NULL); //接收完成销毁消息队列ID
if(ret <0)
{
perror("msgctl()");
exit(1);
}
exit(0); //退出
}
编译文件:Makefile
all: rcver sender
rcver:rcver.o
$(CC) $^ -o $@
sender:sender.o
$(CC) $^ -o $@
clean:
$(RM) *.o rcver sender
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现