消息对列,共享内存

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;
}
相关推荐
晓蛋5 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
未济5 天前
linux 配置环境变量
linux
傲世仙尊5 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
牵猫散步的鱼儿5 天前
重载、重写(覆盖)、重定义区别
c语言
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
phltxy5 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
m0_547486665 天前
《数据结构教程》全套 PPT课件2026
数据结构
_艾伦 耶格尔.5 天前
进程间通信
linux