消息对列,共享内存

1.消息队列消发送接收数据

发送数据端

复制代码
#include <myhead.h>

#define leng sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
	long mtype;       /* 消息的类型*/
    char mtext[1024];    /* 消息的正文*/
};


int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'6');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf send;
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		getchar();
		printf("请输入消息的正文:");
		fgets(send.mtext,sizeof(send.mtext),stdin);
		send.mtext[strlen(send.mtext)-1]='\0';
		msgsnd(msgID,&send,leng,0);
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}

	}

	if(msgctl(msgID,IPC_RMID,NULL)==-1)
	{
		printf("删除失败\n");
	}


	return 0;
}

接收数据端

复制代码
#include <myhead.h>

#define leng sizeof(struct msgbuf)-sizeof(long)
struct msgbuf
{
	long mtype;       /* 消息的类型*/
    char mtext[1024];    /* 消息的正文*/
};


int main(int argc, const char *argv[])
{
	key_t key=ftok("./",'6');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf rcv;
	while(1)
	{

		msgrcv(msgID,&rcv,leng,0,0);
		printf("%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}

	}
	return 0;
}

2.共享内存发送接收数据

发送数据端

复制代码
#include <myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'6');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
	int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}

	char *shmADD=shmat(shmID,NULL,0);
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}

	char buff[1024];

	while(1)
	{
		printf("请输入共享内存的内容:");
		fgets(buff,sizeof(buff),stdin);
		strcpy(shmADD,buff);
		if(strcmp(shmADD,"quit\n")==0)
		{
			break;
		}
	}


	return 0;
}

接收数据端

复制代码
#include <myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
	key_t key = ftok("./",'6');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
	int shmID=shmget(key,PAGE_SIZE,IPC_CREAT|0664);
	if(shmID==-1)
	{
		perror("shmget");
		return -1;
	}

	char *shmADD=shmat(shmID,NULL,0);
	if(shmADD==(void *)-1)
	{
		perror("shmat");
		return -1;
	}

	char buff[1024];

	while(1)
	{
		printf("%s\n",shmADD);
		if(strcmp(shmADD,"quit\n")==0)
		{
			break;
		}
	}


	return 0;
}

3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列

user1

复制代码
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)

struct msgbuf {
    long mtype;       /* 消息的类型*/
    char mtext[1024];    /* 消息的正文*/
};

pthread_mutex_t fastmutex;

int send_data()
{
	pthread_mutex_lock(&fastmutex);
	key_t key=ftok("./",'1');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf send;
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		getchar();
		printf("请输入消息的正文:");
		fgets(send.mtext,sizeof(send.mtext),stdin);
		send.mtext[strlen(send.mtext)-1]='\0';
		msgsnd(msgID,&send,leng,0);
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}

	}

	if(msgctl(msgID,IPC_RMID,NULL)==-1)
	{
		printf("删除失败\n");
	}
	pthread_mutex_unlock(&fastmutex);
	return 0;
}

int rcv_data()
{
	pthread_mutex_lock(&fastmutex);
	key_t key=ftok("./",'a');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf rcv;
	while(1)
	{

		msgrcv(msgID,&rcv,leng,0,0);
		printf("%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}

	}
	pthread_mutex_unlock(&fastmutex);
	return 0;

}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&fastmutex, NULL);
	pid_t pid;
	pid=fork();
	if(pid>0)
	{
		send_data();

	}
	else if(pid==0)
	{
		rcv_data();
	}
	else
	{
		perror("fork");
		return -1;
	}
	pthread_mutex_destroy(&fastmutex);

	return 0;
}

user2

复制代码
#include <myhead.h>
#define leng sizeof(struct msgbuf) - sizeof(long)

struct msgbuf {
    long mtype;       /* 消息的类型*/
    char mtext[1024];    /* 消息的正文*/
};

pthread_mutex_t fastmutex;

int send_data()
{
	pthread_mutex_lock(&fastmutex);
	key_t key=ftok("./",'a');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf send;
	while(1)
	{
		printf("请输入消息的类型:");
		scanf("%ld",&send.mtype);
		getchar();
		printf("请输入消息的正文:");
		fgets(send.mtext,sizeof(send.mtext),stdin);
		send.mtext[strlen(send.mtext)-1]='\0';
		msgsnd(msgID,&send,leng,0);
		if(strcmp(send.mtext,"quit")==0)
		{
			break;
		}

	}

	if(msgctl(msgID,IPC_RMID,NULL)==-1)
	{
		printf("删除失败\n");
	}

	pthread_mutex_unlock(&fastmutex);
	return 0;
}

int rcv_data()
{
	pthread_mutex_lock(&fastmutex);
	key_t key=ftok("./",'1');
	if(key==-1)
	{
		perror("ftok");
		return -1;
	}
	
	int msgID=msgget(key,IPC_CREAT|0664);
	if(msgID==-1)
	{
		perror("msgget");
		return -1;
	}
	struct msgbuf rcv;
	while(1)
	{

		msgrcv(msgID,&rcv,leng,0,0);
		printf("%s\n",rcv.mtext);
		if(strcmp(rcv.mtext,"quit")==0)
		{
			break;
		}

	}
	pthread_mutex_unlock(&fastmutex);
	return 0;

}
int main(int argc, const char *argv[])
{
	pthread_mutex_init(&fastmutex, NULL);
	pid_t pid;
	pid=fork();
	if(pid>0)
	{
		send_data();

	}
	else if(pid==0)
	{
		rcv_data();
	}
	else
	{
		perror("fork");
		return -1;
	}
	pthread_mutex_destroy(&fastmutex);
	return 0;
}
相关推荐
VT.馒头1 分钟前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa10 分钟前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior11 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
予枫的编程笔记13 分钟前
【Linux进阶篇】从基础到实战:grep高亮、sed流编辑、awk分析,全场景覆盖
linux·sed·grep·awk·shell编程·文本处理三剑客·管道命令
Sheep Shaun14 分钟前
揭开Linux的隐藏约定:你的第一个文件描述符为什么是3?
linux·服务器·ubuntu·文件系统·缓冲区
Tfly__22 分钟前
在PX4 gazebo仿真中加入Mid360(最新)
linux·人工智能·自动驾驶·ros·无人机·px4·mid360
陈桴浮海23 分钟前
【Linux&Ansible】学习笔记合集二
linux·学习·ansible
生活很暖很治愈31 分钟前
Linux——环境变量PATH
linux·ubuntu
?re?ta?rd?ed?34 分钟前
linux中的调度策略
linux·运维·服务器
深圳市九鼎创展科技35 分钟前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算