消息对列,共享内存

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;
}
相关推荐
Stara051113 分钟前
Linux系统常用操作与命令指南
linux·vim
一丝晨光18 分钟前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
white.tie39 分钟前
linux配置nginx
linux·运维·nginx
TN_stark93241 分钟前
多进程/线程并发服务器
服务器·算法·php
Komorebi.py44 分钟前
【Linux】-学习笔记03
linux·笔记·学习
汉克老师1 小时前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
dessler1 小时前
云计算&虚拟化-kvm创建网桥(bridge)
linux·运维·云计算
YRr YRr1 小时前
Ubuntu20.04 解决一段时间后键盘卡死的问题 ubuntu
linux·数据库·ubuntu
smj2302_796826522 小时前
用枚举算法解决LeetCode第3348题最小可整除数位乘积II
python·算法·leetcode
CyberMuse2 小时前
表的数据结构和常见操作
数据结构