2024.8.6 作业

news2024/11/25 12:51:31

1> 使用消息队列完成两个进程之间相互通信

snd.c

#include <myhead.h>

struct msgbuf
{
	long mtype;
	char mtext[1024];
};

#define SIZE sizeof(struct msgbuf)-sizeof(long)

int main(int argc,const char *argv[])
{
	pid_t pid = fork();
 	if(pid==-1)
 	{
		perror("fork error");
		return -1;
	}		
	else if(pid==0)
	{
		//子进程
		key_t key = ftok("/",'k');
		int msqid = msgget(key,IPC_CREAT|0644);
		if(msqid==-1)
		{
			perror("msgget error");
			return -1;
		}
		struct msgbuf buf;
		while(1)                  //接受类型2消息
		{
			msgrcv(msqid,&buf,SIZE,2,0);
			if(strcmp(buf.mtext,"quit")==0)
			{
				break;
			}
			printf("收到消息:%s\n",buf.mtext);
		}
		exit(EXIT_SUCCESS);
	}
	//父进程
	key_t key = ftok("/",'k');
	int msqid = msgget(key,IPC_CREAT|0644);
	if(msqid==-1)
	{
		perror("msgget error");
		return -1;
	}
	struct msgbuf buf;
	while(1)               //发送类型1消息
	{
		fgets(buf.mtext,SIZE,stdin);
		buf.mtext[strlen(buf.mtext)-1]=0;
		buf.mtype=1;
		msgsnd(msqid,&buf,SIZE,0);
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
	}
	
	wait(NULL);
    return 0;
}

recv.c

#include <myhead.h>

struct msgbuf
{
	long mtype;
	char mtext[1024];
};

#define SIZE sizeof(struct msgbuf)-sizeof(long)

int main(int argc,const char *argv[])
{
 	pid_t pid = fork();
 	if(pid==-1)
 	{
		perror("fork error");
		return -1;
	}		
	else if(pid==0)
	{
		//子进程
		key_t key = ftok("/",'k');
		int msqid = msgget(key,IPC_CREAT|0644);
		if(msqid==-1)
		{
			perror("msgget error");
			return -1;
		}
		struct msgbuf buf;
		while(1)                   //发送类型2消息
		{
			fgets(buf.mtext,SIZE,stdin);
			buf.mtext[strlen(buf.mtext)-1]=0;
			buf.mtype=2;
			msgsnd(msqid,&buf,SIZE,0);
			if(strcmp(buf.mtext,"quit")==0)
			{
				break;
			}
		}
		exit(EXIT_SUCCESS);
	}
	key_t key = ftok("/",'k');
	int msqid = msgget(key,IPC_CREAT|0644);
	if(msqid==-1)
	{
		perror("msgget error");
		return -1;
	}
	struct msgbuf buf;
	while(1)                         //接受类型1消息
	{
		msgrcv(msqid,&buf,SIZE,1,0);
		if(strcmp(buf.mtext,"quit")==0)
		{
			break;
		}
		printf("收到消息:%s\n",buf.mtext);
	}

	wait(NULL);
    if(msgctl(msqid,IPC_RMID,NULL)==-1)
	{
		perror("msgctl error");
		return -1;
	}
    return 0;
}

2> 将共享内存的实现重新敲一遍

snd.c

#include<myhead.h>
#include<sys/user.h>

int main(int argc, const char *argv[])
{
    //1、创建key值用于创建共享内存段
    key_t key = ftok("/", 't');
    if(key == -1)
    {
        perror("ftok error");
        return -1;
    }

    printf("key = %d\n", key);

    //2、创建一个共享内存的对象
    int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);
    if(shmid == -1)
    {
        perror("shmget error");
        return -1;
    }
    printf("shmid = %d\n", shmid);

    //3、将共享内存段映射到程序中来
    char *addr = (char *)shmat(shmid, NULL, 0);

    printf("addr = %p\n", addr);         //输出映射的地址

    //向共享内存中写入数据
    strcpy(addr, "hello a hua qing yuan jian\n");

    sleep(5);

    //取消映射关系
    if(shmdt(addr) ==-1)
    {
        perror("shmdt error");
        return -1;
    }

    while(1);
    return 0;
}

recv.c

#include<myhead.h>
#include<sys/user.h>

int main(int argc, const char *argv[])
{
    //1、创建key值用于创建共享内存段
    key_t key = ftok("/", 't');
    if(key == -1)
    {
        perror("ftok error");
        return -1;
    }

    printf("key = %d\n", key);

    //2、创建一个共享内存的对象
    int shmid = shmget(key, PAGE_SIZE, IPC_CREAT|0664);
    if(shmid == -1)
    {
        perror("shmget error");
        return -1;
    }
    printf("shmid = %d\n", shmid);

    //3、将共享内存段映射到程序中来
    char *addr = (char *)shmat(shmid, NULL, 0);

    printf("addr = %p\n", addr);         //输出映射的地址

    //读出共享内存中的数据
    printf("消息为:%s", addr);

    sleep(5);
    if(shmdt(addr) == -1)
    {
        perror("shmdt error");
        return -1;
    }

    //删除共享内存
    if(shmctl(shmid, IPC_RMID, NULL) == -1)
    {
        perror("shmctl error");
        return -1;
    }
    while(1);
    return 0;
}

 思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++入门(下)】—— 我与C++的不解之缘(二)

前言 接上篇&#xff0c;继续来学习C&#xff0c;本篇内容大概有 引用&#xff0c;inline 和 nullptr。 六、引用&#xff1a; 6.1、引用的定义 引用不是新定义一个变量&#xff0c;而是给已存在的变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它…

SQL基础命令

目录 查看版本 root登录 查看用户 数据库清单 创建数据库 选择数据库 删除数据库 退出 MySQL 查看版本 mysql --version root登录 mysql -uroot -p 查看用户 select user()&#xff1b; 数据库清单 show databases; 创建数据库 # create database xxx; create dat…

heic格式批量转化jpg,这几个方法简单好上手!

在这个数字化时代&#xff0c;手机摄影已成为我们记录生活、分享美好的重要方式。然而&#xff0c;苹果用户可能会遇到一个头疼的问题——拍摄的照片默认保存为HEIC格式&#xff0c;这种格式虽然能大幅节省存储空间&#xff0c;但在非苹果设备上查看或编辑时却不太方便。别担心…

8月开始|660/880/严选题45天强化带刷计划

45天刷完《严选题》《660》《880》&#xff1f; 可能吗&#xff1f; 是不是又在制造焦虑&#xff1f; 别急&#xff0c;其实严选题《660》《880》的核心知识点并不多&#xff0c;45天完全能够刷完&#xff0c;下面就是帮大家整理总结的这些习题册的核心知识点和重点题&#…

【多线程-从零开始-肆】线程安全、加锁和死锁

进程状态 进程状态&#xff1a; 就绪&#xff1a;正在 CPU 上执行&#xff0c;或者随时可以去 CPU 上执行阻塞&#xff1a;暂时不能参与 CPU 的执行 Java 的线程&#xff0c;对应状态做了更详细的区分&#xff0c;不仅仅是就绪和阻塞了 六种状态&#xff1a; NEW 当前 Thread…

vulnhub靶机实战_DC-8

一、靶机下载 靶机下载链接汇总&#xff1a;https://download.vulnhub.com/使用搜索功能&#xff0c;搜索dc类型的靶机即可。本次实战使用的靶机是&#xff1a;DC-8系统&#xff1a;Debian下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 二、靶机启动 下载完…

C++编程基础的学习

Qt跨平台特性 在深入探讨C编程的基础知识之前&#xff0c;我们首先需要了解Qt框架的跨平台特性。Qt是一个功能强大的跨平台应用程序框架&#xff0c;它允许开发者编写一次代码&#xff0c;然后在多个平台上运行&#xff0c;包括Windows、macOS、Linux、iOS、Android等。这种跨…

Linux网络编程3

并发服务器 1.TCP多进程并发服务器 服务器端&#xff1a; 客户端&#xff1a; 2.TCP多线程服务器 服务器端&#xff1a; 客户机端&#xff1a; 需要学习的函数还有 1. send() 函数 send() 函数用于在套接字上发送数据。它是网络编程中发送数据到对端的主要函数之一。 函数…

人像修图-高低频磨皮

原理 将图像分成高频图层&#xff08;处理纹理细节&#xff09;和低频图层&#xff08;处理光影和光影&#xff09;&#xff0c;以达到修饰时互不干扰 步骤 复制两个图层 在低频图层建立高斯模糊&#xff1a;滤镜->模糊->高斯模糊。注意半径一般根据皮肤占比&#xf…

day 20进程

一、程序和进程的区别 程序&#xff1a;保存在磁盘空间中的的一段代码的集合&#xff0c;死的 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建、调度和消亡的过程 二、进程相关的命令 PID:进程的标识符(进程的ID) PPID:父进程的ID号 三、进程的创建…

redis的数据结构与对象

简单动态字符串 文章目录 简单动态字符串SDS的定义SDS的结构图示结构SDS字段解析SDS的特点 SDS和字符串的区别常数复杂度获取字符串的长度杜绝缓冲区的溢出减少修改字符串时的内存分配次数二进制安全兼容部分c字符串函数总结 链表链表和链表节点的实现链表节点&#xff08;list…

全球手机基站位置数据,包含(2G-5G)基站

OpenCellID 是一个由社区维护的项目&#xff0c;它提供了一个开放的数据集&#xff0c;包含全球各地的移动通信基站信息。这个项目对于需要获取蜂窝网络基础设施详细信息的研究人员、开发者以及组织来说非常有用。这些信息可以被用来进行各种分析和应用开发&#xff0c;例如改进…

Python 在开发中的设计模式有哪些?怎样使用?

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 今天我们要聊点硬核的——设计模式。不过&#xff0c;不用担心&#xff0c;我会带着热情来跟你分享这些看似枯燥的知识点。让我们一起从“代码搬砖工”蜕变成“代码艺术家”吧&#xff…

Redis面试题大全

文章目录 Redis有哪几种基本类型Redis为什么快&#xff1f;为什么Redis6.0后改用多线程?什么是热key吗&#xff1f;热key问题怎么解决&#xff1f;什么是热Key&#xff1f;解决热Key问题的方法 什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f;缓存击穿缓存穿透缓存雪崩 Redis…

python爬虫预备知识三-多进程

python实现多进程的方法&#xff1a;fork、multiprocessing模块创建多进程。 os.fork方法 os.fork方法只适合于unix/linux系统&#xff0c;不支持windows系统。 fork方法调用一次会返回两次&#xff0c;原因在于操作系统将当前进程&#xff08;父进程&#xff09;复制出一份…

ESP8266使用舵机以及16路PWM舵机PCA 9685的使用方式

PWM全称 50Hz也就是一秒内变换50次 根据上面的公式 一个高电平一个低电平叫一个脉冲。 例如每个脉冲占20毫秒&#xff0c;那么他的频率是多少&#xff1f; 就是用1去除以他的周期&#xff0c;也就是我们上面说的20&#xff0c;那么就是除0.02,1秒等于1000毫秒&#xff0c;20…

网络安全 - 应急响应检查表

前言 本项目旨在为应急响应提供全方位辅助&#xff0c;以便快速解决问题。结合自身经验和网络资料&#xff0c;形成检查清单&#xff0c;期待大家提供更多技巧&#xff0c;共同完善本项目。愿大家在应急之路一帆风顺。 图片皆来源于网络&#xff0c;如有侵权请联系删除。 一…

南山智尚10亿元定增质疑声连连,与控股股东超70亿资金往来引瞩目

《港湾商业观察》施子夫 王璐 近期&#xff0c;南山智尚&#xff08;300918.SZ&#xff09;发布了《向特定对象发行A股股票募集说明书(修订稿)》。 据了解&#xff0c;公司此次拟募集资金总额不超过10亿元&#xff0c;扣除发行费用后的募集资金净额将全部用于年产8万吨高性能…

鸿蒙HarmonyOS实战:ArkUI组件添加内容背景模糊效果

动画效果可以丰富界面的细节&#xff0c;提升UI界面的真实感和品质感。例如&#xff0c;模糊和阴影效果可以让物体看起来更加立体&#xff0c;使得动画更加生动。ArkUI提供了丰富的效果接口&#xff0c;开发者可快速打造出精致、个性化的效果。本章中主要对常用的模糊、阴影和色…

速卖通、Lazada、虾皮卖家是如何自建买家账号测评的?

在跨境电商领域&#xff0c;速卖通、Lazada、Shopee等平台上的卖家为了提升店铺信誉、提高产品排名和销量&#xff0c;常常需要借助买家账号进行测评。然而&#xff0c;依赖外部服务商往往存在风险&#xff0c;如账号质量参差不齐、恶意差评等问题。因此&#xff0c;自己养国外…