进程线程。

news2024/11/23 7:33:32

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

#include <myhead.h>
int main(int argc, const char *argv[])
{
	if(argc!=5)
	{
		puts("输入错误请重新输入");
		return -1;
	}
	pid_t pid=-1;
	pid=fork();
	if(pid>0)
	{
		int wfd=-1;
		if((wfd=open(argv[1],O_WRONLY))==-1)
		{
			perror("open 1 error");
			return -1;
		}	
		int rfd=-1;
		if((rfd=open(argv[3],O_RDONLY))==-1)
		{
			perror("open 3 error");
			return -1;
		}
		char a[10];
		while(1)
		{
			bzero(a,sizeof(a));
			int res=read(rfd,a,sizeof(a));
			if(res<=0)
				break;
			write(wfd,a,res);
		}
		close(wfd);
		close(rfd);
		puts("管道1写入完成");
		wait(NULL);
		puts("管道文件均完成任务");
	}
	else if(pid==0)
	{
		int rfd=-1;
		if((rfd=open(argv[2],O_RDONLY))==-1)
		{
			perror("open 2 error");
			return -1;
		}
		int wfd=-1;
		if((wfd=open(argv[4],O_WRONLY|O_TRUNC))==-1)
		{
			perror("open 4 error");
			return -1;
		}	
		char a[10];
		while(1)
		{
			bzero(a,sizeof(a));
			int res=read(rfd,a,sizeof(a));
			if(res<=0)
				break;
			write(wfd,a,res);
		}
		close(wfd);
		close(rfd);
		puts("管道2读取完成完成");
		exit(0);
	}
	else
	{
		perror("fork error");
		return -1;
	}
	return 0;
}

2> 使用无名管道完成父子进程间的通信

#include <myhead.h>
int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		puts("请重新输入");
		return -1;
	}
	int pipefd[2]={0};
	if(pipe(pipefd)==-1)
	{
		perror("pipe error");
		return -1;
	}
	printf("p1=%d,p2=%d\n",pipefd[0],pipefd[1]);
	pid_t pid=-1;	
	pid=fork();
	if(pid>0)
	{
		//父进程,向无名管道文件内写入数据
		int fd=-1;
		if((fd=open(argv[1],O_RDONLY))==-1)
		{
			perror("open fd");
			return -1;
		}
		char a[50]="";
		while(1)
		{
			bzero(a,sizeof(a));
			int res=read(fd,a,sizeof(a));
			if(res<=0)
			break;
			write(pipefd[1],a,res);
		}
		close(fd);
		close(pipefd[1]);
		puts("文件输入完成");
		wait(NULL);
		puts("拷贝完成");
	}
	else if(pid==0)
	{
		//子进程,写
		int wfd=-1;
		if((wfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC|O_EXCL,0664))==-1)
		{
			if(errno=EEXIST)
			{
				puts("文件已存在,请直接使用");
				wfd=open(argv[2],O_WRONLY|O_TRUNC);
			}
			else
			{
				perror("open wfd");
				return -1;
			}
		}
		char a[60]="";
		while(1)
		{
			bzero(a,sizeof(a));
			int res=read(pipefd[0],a,sizeof(a));
			write(wfd,a,res);
			if(res<sizeof(a))
				break;
		}
		close(wfd);
		close(pipefd[0]);
		puts("文件读取完成");
		exit(EXIT_SUCCESS);
	}
	return 0;
}

3> 使用标准IO完成两个文件的拷贝

#include <myhead.h>
int main(int argc, const char *argv[])
{
	FILE *rfd;
	FILE *wfd;
	if((rfd=fopen("./1.c","r"))==NULL)
	{
		perror("fopen rfd");
		return -1;
	}	
	if((wfd=fopen("./1.txt","w"))==NULL)
	{
		perror("fopen wfd");
		return -1;
	}
	char a[20];
	while(1)
	{
		int res=fread(a,1,sizeof(a),rfd);
		if(res<=0)
			break;
		fwrite(a,1,res,wfd);
	}
	fclose(rfd);
	fclose(wfd);
	puts("拷贝完成");
	return 0;
}

4> 使用文件IO实现两个文件的拷贝

#include <myhead.h>
int main(int argc, const char *argv[])
{
	int rfd=-1;
	int wfd=-1;
	if((rfd=open("./1.c",O_RDONLY))==-1)
	{
		perror("open rfd");
		return -1;
	}
	if((wfd=open("./1.txt",O_WRONLY))==-1)
	{
		perror("open wfd");
		return -1;
	}
	char a[20]="";
	while(1)
	{
		int res=read(rfd,a,sizeof(a));
		if(res<=0)
			break;
		write(wfd,a,res);
	}
	close(rfd);
	close(wfd);
	puts("拷贝完成");
	return 0;
}

5> 使用多进程完成两个文件的拷贝

#include <myhead.h>
int lengh()
{
	int rfd=-1;
	int wfd=-1;
	if((rfd=open("./1.c",O_RDONLY))==-1)
	{
		perror("open rfd");
		return -1;
	}
	if((wfd=open("./1.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open wfd");
		return -1;
	}
	int len=lseek(rfd,0,SEEK_END);
	return len;
}
int kb(int s,int e)
{
	int rfd=-1;
	int wfd=-1;
	if((rfd=open("./1.c",O_RDONLY))==-1)
	{
		perror("open rfd");
		return -1;
	}
	if((wfd=open("./1.txt",O_WRONLY))==-1)
	{
		perror("open wfd");
		return -1;
	}
	lseek(rfd,s,SEEK_SET);
	lseek(wfd,s,SEEK_SET);
	char a[20];
	int sum=0;
	while(1)
	{
		int res=read(rfd,a,sizeof(a));
		sum+=res;
		if(res<=0||sum>e)
		{
			write(wfd,a,res-(sum-e));
			break;
		}
		write(wfd,a,res);
	}
	close(rfd);
	close(wfd);
}
int main(int argc, const char *argv[])
{
	int len=lengh();
	pid_t pid=-1;
	pid=fork();
	if(pid>0)
	{
		kb(0,len/2);
		puts("父进程拷贝完成");
		wait(NULL);
		puts("拷贝完成");
	}
	else if(pid==0)
	{
		kb(len/2,len-len/2);
		puts("子进程拷贝完成");
		exit(0);
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

6> 使用多线程完成两个文件的拷贝

#include <myhead.h>
typedef struct a
{
	int s;
	int e;
}ok;
int lengh()
{
	int rfd=-1;
	int wfd=-1;
	if((rfd=open("./1.c",O_RDONLY))==-1)
	{
		perror("open rfd");
		return -1;
	}
	if((wfd=open("./1.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open wfd");
		return -1;
	}
	int len=lseek(rfd,0,SEEK_END);
	return len;
}
int kb(int s,int e)
{
	int rfd=-1;
	int wfd=-1;
	if((rfd=open("./1.c",O_RDONLY))==-1)
	{
		perror("open rfd");
		return -1;
	}
	if((wfd=open("./1.txt",O_WRONLY))==-1)
	{
		perror("open wfd");
		return -1;
	}
	lseek(rfd,s,SEEK_SET);
	lseek(wfd,s,SEEK_SET);
	char a[20];
	int sum=0;
	while(1)
	{
		int res=read(rfd,a,sizeof(a));
		sum+=res;
		if(res<=0||sum>e)
		{
			write(wfd,a,res-(sum-e));
			break;
		}
		write(wfd,a,res);
	}
	close(rfd);
	close(wfd);
}
void *task(void *arg)
{
	 ok a=*(ok*)arg;	
	kb(a.s,a.e);
	puts("子线程拷贝完成");
	pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
	int len=lengh();
	ok f1={0,len/2};
	ok f2={len/2,len-len/2};
	pthread_t tid1=-1;
	pthread_create(&tid1,NULL,task,&f1);	
	pthread_t tid2=-1;
	pthread_create(&tid2,NULL,task,&f2);
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	puts("拷贝完成");
	return 0;
}

7> 将互斥锁的案例重新写一遍


#include <myhead.h>
 
pthread_cond_t cond;
pthread_mutex_t mutex;
 
void *task1(void *arg)
{
	int n=5;
	while(n--)
	{
		sleep(1);
		printf("sum+1\n");
		pthread_cond_signal(&cond);
	}
	printf("结束\n");
	pthread_exit(NULL);
}
void *task2(void *arg)
{
	while(1)
	{
		pthread_mutex_lock(&mutex);
		pthread_cond_wait(&cond,&mutex);
 
		printf("sum-1\n");
		
		pthread_mutex_unlock(&mutex);
		pthread_exit(NULL);
	}
}
 
int main(int argc, const char *argv[])
{
			
	pthread_t tid1,tid2,tid3,tid4,tid5,tid6;
 
	pthread_cond_init(&cond,NULL);
	pthread_mutex_init(&mutex,NULL);
 
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid3,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid4,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid5,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid6,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		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_cond_destroy(&cond);
	pthread_mutex_destroy(&mutex);
	
 
	return 0
}

8> 将无名信号量实现生产者消费者程序重新实现一遍

#include <myhead.h>
 
sem_t sem;
 
void *task1(void *arg)
{
	while(1)
	{
		sleep(1);
		printf("sum+1\n");
		sem_post(&sem);
	}
 
 
}
void *task2(void *arg)
{
	while(1)
	{
		sem_wait(&sem);
		printf("sum-1\n");
	}
 
}
int main(int argc, const char *argv[])
{
 
	pthread_t tid1,tid2;
	sem_init(&sem,0,0);
	if(pthread_create(&tid1,NULL,task1,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
	if(pthread_create(&tid2,NULL,task2,NULL)!=0)
	{
		printf("error\n");
		return -1;
	}
 
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	
	sem_destroy(&sem);
	return 0;
}

9> 将条件变量实现生产者消费者程序重新实现一遍

#include <myhead.h>
 
int main(int argc, const char *argv[])
{
	int pipefd[2];
	if(pipe(pipefd)==-1)
	{
		perror("pipe");
		return -1;
	}
 
 
	pid_t pid=fork();
	if(pid==0)//子进程
	{
		close(pipefd[1]);
		
		char rbuf[128]="";
		while(1)
		{
			bzero(rbuf,sizeof(rbuf));
			read(pipefd[0],rbuf,sizeof(rbuf));
			printf("子进程%s\n",rbuf);
		
			if(strcmp(rbuf,"quit")==0)
				break;
		}
		close(pipefd[0]);
		exit(EXIT_SUCCESS);
 
	}
	else if(pid>0)//父进程
	{
	
		close(pipefd[0]);
		
		char buf[128]="";
		while(1)
		{
			fgets(buf,sizeof(buf),stdin);
			buf[strlen(buf)-1]='\0';
			write(pipefd[1],buf,sizeof(buf));
			
			if(strcmp(buf,"quit")==0)
				break;
		}
		close(pipefd[1]);
	}
	else
	{
		printf("error\n");
		return -1;
	}
	wait(NULL);
	return 0;
}

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

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

相关文章

PPT插件-好用的插件-插入媒体-大珩助手

批量媒体 包含批量视频、批量音频、批量图片&#xff0c;可实现从光标所在的位置开始&#xff0c;每页插入一个视频、一个音频、一张图片&#xff0c;且图片和视频的尺寸与当前幻灯片尺寸一致 插入文本 包含黑字无底、白字红底、白字黛底、白字绿底、白字蓝底预设一键文本&am…

springboot房屋房产房管家中介服务系统+java-ssm

随着房地产市场的快速发展&#xff0c;中国经济飞速发展&#xff0c;社会城市化建设的脚步不断加快&#xff0c;社会城市化的规模也在不断扩大&#xff0c;房屋中介逐渐成为当今社会生活的重要部分&#xff0c;房屋中介的市场竞争也日益加剧&#xff0c;房屋中介的管理与服务成…

linux redis-cluster ipv6方式

配置文件&#xff0c;具体字段的含义&#xff0c;可以参考其他文档。 1.单个文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

IOS添加三方库之后项目编译没问题安装不上

code:-402653103 将新添加的framework embe&sign 改为do not embed

深度学习基本概念

1.全连接层 全连接层就是该层的所有节点与输入节点全部相连&#xff0c;如图所 示。假设输入节点为X1&#xff0c; X 2&#xff0c; X 3&#xff0c;输出节点为 Y 1&#xff0c; Y 2&#xff0c; Y 3&#xff0c; Y 4。令 矩阵 W 代表全连接层的权重&#xff0c; W 12也就代表 …

6U CPCI测控系列可定制型测控机箱

CPCI测控系列 XM-3646 内置300WH锂智能电池超强续航能力 可选配外置电池无限续航 符合CPCI总线标准规范 内置6U 4槽CPCI背板 内置CPCI-9370控制器 可内置数采、航空总线、通讯接口等功能模块 全铝镁合金加固紧凑型设计 特殊防撞包角及硅胶把手设计 15.6高清显示屏1920x…

nodejs微信小程序+python+PHP沧州地区空气质量数据分析系统-计算机毕业设计推荐 django

本系统不仅主要实现了注册登录&#xff0c;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;城市区域管理&#xff0c;空气状况管理&#xff0c;空气质量管理&#xff0c;系统管理&#xff0c;数据爬取&#xff0c;大屏分析等功能&#xff0c;通过这些功能基本可…

vue3 echarts 各省地图展示

效果&#xff1a; 1.在src下新建utils文件夹添加各省地图的json文件&#xff08;下载各省地图的网址 DataV.GeoAtlas地理小工具系列&#xff09; 2.安装echarts npm install echarts 3.在项目文件中中引入json <template><div class"back"><div id…

项目经理和产品经理该如何选择?

最近很多人咨询“项目经理跟产品经理该怎么选&#xff0c;我更适合哪个&#xff1f;”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等&#xff0c;今天就一次性说清楚项目经理跟产品经理有什么区别&#xff0c;应该怎么选择。 不想看长篇大论的&#x…

处理货物数据

主题 对xlsx文件进行清洗 第一步 将g2到y2的标题复制到g4和y4 安装操作库 pip install openpyxl下载失败&#xff0c;更换为阿里源 pip install library -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com下载仍然失败 再次换源 pip instal…

最新鸿蒙HarmonyOS4.0开发登陆的界面2

登陆功能 代码如下&#xff1a; import router from ohos.router; Entry Component struct Index {State message: string XXAPP登陆State userName: string ;State password: string ;build() {Row() {Column({space:50}) {Image($r(app.media.icon)).width(200).interpol…

《使用ThinkPHP6开发项目》 - 登录接口一

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 《使用ThinkPHP6开发项目》 - 创建应用-CSDN博客 《使用ThinkPHP6开发项目》 - 创建控制器-CSD…

php 使用box打包

1.安装box 2.检查是否安装成功 3.查看路径&#xff0c;把路径添加到环境变量&#xff0c;方便使用 4.php项目根目录增加box.json配置文件 5.运行命令生成。这个是在cmd中运行的&#xff0c;记得切换到php源码目录 6.使用 php FastAdmin.phar运行。 说明&#xff1a;如果是常驻…

智能优化算法应用:基于布谷鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于布谷鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于布谷鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.布谷鸟算法4.实验参数设定5.算法结果6.参考文…

lwIP 细节之三:errf 回调函数是何时调用的

使用 lwIP 协议栈进行 TCP 裸机编程&#xff0c;其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数&#xff0c;注册到协议栈&#xff0c;在适当的时候&#xff0c;由协议栈自动调用&#xff0c;所以称为回调。 注&#xff1a;除非特别说明&#xff0c;以下内…

智选假日酒店大中华区迎来开业、在建500家里程碑

“90后”先锋品牌&#xff0c;智选假日酒店在华实现骄人突破&#xff0c;成就非凡 2023年12月12日&#xff0c;中国上海 — 洲际酒店集团今日宣布&#xff0c;旗下中高端精选服务品牌智选假日酒店迎来大中华区的开业和在建酒店数量突破500家这一发展里程碑。智选假日酒店凭借其…

如何利用供应商细分,更好管理供应商关系?

对于一些企业来说&#xff0c;与供应商关系密切&#xff0c;是避免过去几年供应链短缺、延误和价格上涨的关键。但对大多数企业来说&#xff0c;同等关注每个供应商是不可能的&#xff0c;而且成本高昂。 在这种情况下&#xff0c;企业可以使用供应商细分作为确定参与水平的策…

C语言实现在顺序表中找到最大值

用C语言实现在顺序表中找到最大值&#xff1a; #include <stdio.h> #define MAX_SIZE 100 int findMax(int arr[], int size) { int max arr[0]; // 假设第一个元素为最大值 for (int i 1; i < size; i) { // 从第二个元素开始遍历列表 if (…

mockjs 导致cesium地图无法加载

1.报错信息 Uncaught (in promise) TypeError: Failed to execute createImageBitmap on Window: The provided value is not of type (Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElemen…

Linux高级管理--安装MySQL数据库系统

MySQL服务基础 MySQL.是一个真正的多线程、多用户的SQL数据库服务&#xff0c;凭借其高性能、高可靠和易于使 用的特性&#xff0c;成为服务器领域中最受欢迎的开源数据库系统。在2008年以前&#xff0c;MySOL项目由MySQL AB公司进行开发&#xff0c;发布和支持&#xff0c;之后…