消息对列,共享内存

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;
}
相关推荐
像风一样的男人@3 分钟前
Linux --systemctl损坏
linux·运维·服务器
南棱笑笑生6 分钟前
20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速
linux·服务器·网络
南方以南_8 分钟前
【云实验】搭建个人网盘实验
linux·运维·服务器
随意起个昵称18 分钟前
【双指针】供暖器
算法
倒霉蛋小马21 分钟前
最小二乘法拟合直线,用线性回归法、梯度下降法实现
算法·最小二乘法·直线
酷爱码29 分钟前
Linux实现临时RAM登录的方法汇总
linux·前端·javascript
muxue17838 分钟前
chmod 777含义:
linux
codists1 小时前
《算法导论(第4版)》阅读笔记:p82-p82
算法
埃菲尔铁塔_CV算法1 小时前
深度学习驱动下的目标检测技术:原理、算法与应用创新
深度学习·算法·目标检测
帷幄庸者1 小时前
CentOS 上配置 Docker 使用 NVIDIA GPU
linux·docker·centos