IO进程线程第6天

1.使用有名管道完成两个进程的相互通信

send.c代码如下:

#include <myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
		//父进程
		//从管道1中读取数据
		int fd=-1;
		if((fd=open("./mkfifo1",O_RDONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		char rbuf[128]="";

		while(1)
		{
			bzero(rbuf,sizeof(rbuf));
		//	printf("请输入>>>:");
		//	fgets(wbuf,sizeof(wbuf),stdin);
		//	wbuf[strlen(wbuf)-1]=0;
			read(fd,rbuf,sizeof(rbuf));
			if(strcmp(rbuf,"quit")==0)
			{
				break;
			}
			printf("从程序A中读取的数据:%s\n",rbuf);
		}
		close(fd);

	}else if(pid==0)
	{
		//子进程 
		//向管道2中写入数据
		int fd1=-1;
		if((fd1=open("./mkfifo2",O_WRONLY))==-1)
		{
			perror("open error");
			return -1;
		}

		char wbuf[128]="";
		while(1)
		{
			bzero(wbuf,sizeof(wbuf));
		//	printf("请输入>>>:");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]=0;
			write(fd1,wbuf,sizeof(wbuf));
			if(strcmp(wbuf,"quit")==0)
			{
				break;
			}
		//	printf("程序B发送的消息:%s\n",rbuf);
		}
		close(fd1);

	}else
	{
		perror("fork error");
		return -1;
	}

	return 0;
}

recv.c代码如下:

#include <myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0)
	{
		//父进程
		//向管道1中写入数据
		int fd=-1;
		if((fd=open("./mkfifo1",O_WRONLY))==-1)
		{
			perror("open error");
			return -1;
		}
		char wbuf[128]="";

		while(1)
		{
			bzero(wbuf,sizeof(wbuf));
		//	printf("请输入>>>:");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]=0;
			write(fd,wbuf,sizeof(wbuf));
			if(strcmp(wbuf,"quit")==0)
			{
				break;
			}
		}
		close(fd);

	}else if(pid==0)
	{
		//子进程 
		//从管道2中读取数据
		int fd1=-1;
		if((fd1=open("./mkfifo2",O_RDONLY))==-1)
		{
			perror("open error");
			return -1;
		}

		char rbuf[128]="";
		while(1)
		{
			bzero(rbuf,sizeof(rbuf));
			read(fd1,rbuf,sizeof(rbuf));
			if(strcmp(rbuf,"quit")==0)
			{
				break;
			}
			printf("程序B发送的消息:%s\n",rbuf);
		}
		close(fd1);

	}else
	{
		perror("fork error");
		return -1;
	}

	return 0;
}

create.c代码如下:

#include <myhead.h>

int main(int argc, const char *argv[])
{
	if(mkfifo("./mkfifo1",0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}

	if(mkfifo("./mkfifo2",0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}

	getchar();
	system("rm mkfifo1");
	system("rm mkfifo2");
	return 0;
}

运行结果:

2.关于互斥机制的代码实现

#include <myhead.h>
int num=200;

//定义一个锁资源
pthread_mutex_t mutex;

void *task1(void *arg)
{
	//对访问的临界资源进行上锁
	pthread_mutex_lock(&mutex);
	num=120;
	printf("task1 num=%d\n",num);
	//解锁
	pthread_mutex_unlock(&mutex);
	pthread_exit(NULL);
}

void *task2(void *arg)
{
		//对访问的临界资源进行上锁
	pthread_mutex_lock(&mutex);
	sleep(1);
	num++;
	printf("task2 num=%d\n",num);
	pthread_mutex_unlock(&mutex);

	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	//初始化锁
	pthread_mutex_init(&mutex,NULL);
	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	//释放锁资源
	pthread_mutex_destroy(&mutex);
	return 0;
}

运行结果:

3.无名信号量的代码实现如下 :

#include <myhead.h>
//实现无名信号量
//定义无名信号量
sem_t sem1,sem2,sem3;

void *task1(void *arg)
{
	int num=5;
	while(num--)
	{
	sem_wait(&sem1);
	printf("A");
	sem_post(&sem2);
	}
	pthread_exit(NULL);
}


void *task2(void *arg)
{
	int num=5;
	while(num--)
	{
	sem_wait(&sem2);
	printf("B");
	sem_post(&sem3);
	}
	pthread_exit(NULL);
}

void *task3(void *arg)
{
	int num=5;
	while(num--)
	{
		sem_wait(&sem3);
		printf("C\n");
		sem_post(&sem1);
	}
	pthread_exit(NULL);
}
/**************主程序******************/
int main(int argc, const char *argv[])
{
	//初始化无名信号量
	sem_init(&sem1,0,1);
	sem_init(&sem2,0,0);
	sem_init(&sem3,0,0);
	pthread_t tid1,tid2,tid3;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task3,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}

	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);

	return 0;
}

运行结果:

4.实现条件变量代码如下:

#include <myhead.h>
//定义一个条件变量
pthread_cond_t cond;
//定义一个互斥锁
pthread_mutex_t mutex;
void *task1(void *arg)
{
	int num=5;
	while(num--)
	{
		sleep(2);
		printf("tid1生产了一辆奔驰车\n");
		//唤醒等待队列中的线程
		pthread_cond_signal(&cond);
	}
	pthread_exit(NULL);
}

void *task2(void *arg)
{
	//上锁
	pthread_mutex_lock(&mutex);
	pthread_cond_wait(&cond,&mutex);
	printf("消费了一辆车\n");
	//解锁
	pthread_mutex_unlock(&mutex);
	pthread_exit(NULL);
}

int main(int argc, const char *argv[])
{
	//初始化条件变量
	pthread_cond_init(&cond,NULL);
	//初始化一个互斥锁
	pthread_mutex_init(&mutex,NULL);
	pthread_t tid1,tid2,tid3,tid4,tid5,tid6;
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid4,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid5,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}
	if(pthread_create(&tid6,NULL,task2,NULL)!=0)
	{
		perror("pthread_create error");
		return -1;
	}

	//回收线程资源
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	pthread_join(tid3,NULL);
	pthread_join(tid4,NULL);
	pthread_join(tid5,NULL);
	pthread_join(tid6,NULL);

	//释放锁
	pthread_mutex_destroy(&mutex);
	//释放条件变量
	pthread_cond_destroy(&cond);

	return 0;
}

运行结果:

5.无名管道代码实现如下:

#include <myhead.h>

int main(int argc, const char *argv[])
{
	int pipefd[2]={0};
	if(pipe(pipefd)==-1)
	{
		perror("pipe error");
		return -1;
	}
	pid_t pid=fork();
	if(pid>0)
	{
		//父进程
		close(pipefd[0]);
		char wbuf[128]="";
		while(1)
		{
			bzero(wbuf,sizeof(wbuf));
		//	printf("请输入>>>>");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]=0;
			write(pipefd[1],wbuf,sizeof(wbuf));
			if(strcmp(wbuf,"quit")==0)
			{
				break;
			}
		}
		close(pipefd[1]);
		
	}else if(pid==0)
	{
		//子进程
		close(pipefd[1]);
		char rbuf[128]="";
		while(1)
		{
			bzero(rbuf,sizeof(rbuf));
			read(pipefd[0],rbuf,sizeof(rbuf));

			if(strcmp(rbuf,"quit")==0)
			{
				break;
			}
			printf("接收的内容为:%s\n",rbuf);
		}
		close(pipefd[0]);
	}else
	{
		perror("fork error");
		return -1;
	}
	return 0;
}

运行结果:

6.有名管道代码实现如下:

create.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	if(mkfifo("./mk",0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}
	getchar();
	system("rm mk");
	return 0;
}

send.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	if(mkfifo("./mk",0664)==-1)
	{
		perror("mkfifo error");
		return -1;
	}
	getchar();
	system("rm mk");
	return 0;
}
ubuntu@ubuntu:home$ cat mkfifo.c 
#include <myhead.h>
//使用有名管道完成不同进程之间的通信
int main(int argc, const char *argv[])
{
	int wfd=-1;
	if((wfd=open("./mk",O_WRONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	char wbuf[128]="";
	while(1)
	{
		bzero(wbuf,sizeof(wbuf));
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		write(wfd,wbuf,sizeof(wbuf));
		if(strcmp(wbuf,"quit")==0)
		{
			break;
		}
	}
	close(wfd);

	return 0;
}

recv.c

#include <myhead.h>

int main(int argc, const char *argv[])
{
	int rfd=-1;
	if((rfd=open("./mk",O_RDONLY))==-1)
	{
		perror("open error");
		return -1;
	}
	char rbuf[128]="";
	while(1)
	{
		bzero(rbuf,sizeof(rbuf));
		read(rfd,rbuf,sizeof(rbuf));
		if(strcmp(rbuf,"quit")==0)
		{
			break;
		}
		printf("收到的消息:%s\n",rbuf);
	}
	close(rfd);
	return 0;
}

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

已解决的问题:BIOS中Enter键失效_BIOS中回车键没反应

问题&#xff1a; 未解决的问题&#xff1a;BIOS中enter键失效_bios回车键没反应-CSDN博客 问题复现&#xff1a; Windows7 关机 开机按F2进入BIOS 调整Boot Mode&#xff0c;按Enter建&#xff0c;Enter键失效 按F10&#xff0c;按Enter键&#xff0c;Enter键失效 按E…

Leetcode - 周赛385

目录 一&#xff0c;3042. 统计前后缀下标对 I 二&#xff0c;3043. 最长公共前缀的长度 三&#xff0c;3044. 出现频率最高的质数 四&#xff0c;3045. 统计前后缀下标对 II 一&#xff0c;3042. 统计前后缀下标对 I 该题数据范围小&#xff0c;可直接暴力求解&#xff0c;…

基于springboot+vue的电影评论网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Node.js中如何处理异步编程

在Node.js中&#xff0c;处理异步编程是至关重要的技能。由于Node.js的单线程执行模型&#xff0c;异步编程可以极大地提高程序的性能和响应速度。本文将介绍几种常见的异步编程处理方式&#xff0c;并附上示例代码&#xff0c;帮助您更好地理解和应用异步编程技术。 回调函数…

Nginx-----------高性能的 Web服务端 nginx编译安装 、平滑升级(一)

一、Nginx高性能的 Web服务端 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本号是0.1.02019年3月11日F5与NGINX达成协议,F5 将收购…

小折叠也能成为主力机,全新小折叠旗舰华为Pocket 2正式发布

2024年2月22日&#xff0c;华为在三亚举办华为Pocket 2时尚盛典&#xff0c;正式发布其全新小折叠旗舰华为Pocket 2。一直以来&#xff0c;华为致力于萃取各界艺术灵感&#xff0c;不断探寻科技美学的可能性&#xff0c;华为Pocket系列更是秉承将奢雅美学与尖端科技融为一体的理…

第三百六十回

文章目录 1. 概念介绍2. 实现方法2.1 环绕效果2.2 立体效果 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义SlideImageSwitch组件"相关的内容&#xff0c;本章回中将介绍两种阴影效果.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称&#xff0c;它是 Google 公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结 构化数据存储格式&#xff0c;可以用于结构化数据&#xff0c;或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

2024最佳住宅代理IP服务商

跨境出海已成为了近几年的最热趋势&#xff0c;大批量的企业开始开拓海外市场&#xff0c;而海外电商领域则是最受欢迎的切入口。新兴的tiktok、Temu&#xff0c;老牌的Amazon、Ebay&#xff0c;热门的Etsy、Mecari等等都是蓝海一片。跨境入门并不难&#xff0c;前期的准备中不…

H桥逆变方式介绍(单极性)

H桥逆变电路实现的就是一个从DC——AC的过程 这个电路有两个时序&#xff0c;Q6Q4是一个导通时序&#xff0c;Q5Q7是一个导通时序 左边两个是高频20KHZ的、互补的sPWM波&#xff0c;右边是低频的50HZ的PWM波 三角波一般叫载波&#xff0c;正弦波叫调制波&#xff08;单片机内…

串的相关题目

于是他错误的点名开始了 我发现有关hash得题目有些是可以通过map数组来完成的&#xff1a;何为map数组&#xff0c;我们先思考一下最简单的桶的排序&#xff0c;桶排序是将我们需要数字最为下标输进数组中&#xff0c;而数组是存放的数字是这个数字出现的次数&#xff0c;但是由…

PLC_博图系列☞基本指令“异或“运算

PLC_博图系列☞基本指令“异或“运算 文章目录 PLC_博图系列☞基本指令“异或“运算背景介绍X&#xff1a;“异或”运算说明参数示例真值表 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 异或 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的…

06 内存管理

目录 c/c内存分布c语言中动态内存管理方式c中动态内存管理方式operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)常见题 1. c/c内存分布 看一段代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticV…

基于springboot+vue的教学资源库系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

linux操作系统day2(io文件处理)

二进制文件读写&#xff1a; fread()/fwrite() 读&#xff1a; size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能&#xff1a; 从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr 所在的本地内存中。 参数&#xff1a; pt…

【Python Scrapy】分布式爬虫利器

在当今信息爆炸的时代&#xff0c;获取大规模数据对于许多应用至关重要。而分布式爬虫作为一种强大的工具&#xff0c;在处理大量数据采集和高效爬取方面展现了卓越的能力。 本文将深入探讨分布式爬虫的实际应用场景&#xff0c;通过代码示例演示其在提升爬取效率、保障系统稳定…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题&#xff0c;农业农村现代化&#xff0c;离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题&#xff0c;适合做养老业务的老年公…

day09-MongoDB

文章目录 day09-MongoDB一、回顾1.1. 行为实战核心要点说明 二、评论系统2.1 MongoDB2.1.1 MongoDB简介①简介②体系结构与术语 2.1.2 安装与连接2.1.3 Springboot整合MongoDB①引入依赖②添加服务端配置③准备实体类④测试-新增⑤测试-查询⑥测试-更新测试-删除 2.2 app端评论…

配置redis-cell 控流插件

1.下载绑定资源也可以到git上下载 https://gitee.com/dianjinshi/springboot-nginx.git 2.创建文件夹 mkdir redis-cell 3.上传到linux上并进入文件夹解压 4.拷贝 docker cp libredis_cell.so redis:/usr/local/etc/redis 5.重启redis docker restart redis 6.进入redis…

5 步轻松上手,教你从 0 到 1 落地 Jmeter 接口自动化脚本!

Jmeter是进行接口测试的一款非常主流的工具&#xff0c;但绝大部分测试工程师&#xff0c;对于Jmeter接口测试脚本整理都是一知半解的。今天这篇文章&#xff0c;就以一个金融项目中接口为例&#xff0c;通过简单5步&#xff0c;教大家如何0代码编写Jmeter接口自动化脚本&#…