消息对列,共享内存

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;
}
相关推荐
用户61204149221325 分钟前
C语言做的文本词频数量统计功能
c语言·后端·敏捷开发
快手技术2 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub21 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
用户31187945592181 天前
Kylin Linux 10 安装 glib2-devel-2.62.5-7.ky10.x86_64.rpm 方法(附安装包)
linux
CoovallyAIHub1 天前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
涛啊涛1 天前
Centos7非LVM根分区容量不足后扩容,对调硬盘挂载/
linux·磁盘管理