IO进程线程复习:进程线程、通信

news2024/10/6 14:34:33

1.进程的创建

#include<myhead.h>

int main(int argc, const char *argv[])
{
	printf("hello world\n");//父进程执行的内容
	int num=520;//在父进程中定义的变量

	pid_t pid=fork();//创建子进程

	if(pid>0)
	{
		while(1)
		{
			printf("我是父进程,num=%d\n",num);
			sleep(1);
		}
	
	}
	else if(pid==0)
	{
		num=1314;//更改子进程中的num的值
		while(1)
		{
			printf("我是子进程,num=%d\n",num);
			sleep(1);
		}
	
	}else
	{
		perror("fork error");
		return -1;
	}

	
	return 0;
}

2.进程号的获取

#include<myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid=-1;
	//创建一个子进程
	pid=fork();

	//判断父子进程
	if(pid>0)
	{
		printf("我是父进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
	}
	else
	{
		printf("我是子进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
	
	}
	while(1);

	return 0;
}

3.回收进程资源wait

#include<myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid=-1;
	//创建一个子进程
	pid=fork();

	//判断父子进程
	if(pid>0)
	{
		printf("我是父进程,当前进程id号:%d,ppid=%ildid=%d\n",getpid(),getppid(),pid);

		//调用进程退出函数
		//exit(EXIT_SUCCESS);//会刷新缓冲区
		//_exit(EXIT_SUCCESS);//不会刷新缓冲区
	}
	else
	{
		printf("我是子进程,当前进程id号:%d,ppid=%d\n",getpid(),getppid());
		sleep(3);
		exit(EXIT_SUCCESS);//会刷新缓冲区
	
	}
	wait(NULL);//阻塞等待子进程结束
	printf("已经成功回收子进程\n");
	while(1);

	return 0;
}

4.waitpid回收僵尸进程

#include<myhead.h>

int main(int argc, const char *argv[])
{
	pid_t pid=fork();//创建子进程
	if(pid>0)
	{
		printf("我是父进程\n");
		//sleep(5);
	}
	else if(pid==0)
	{
		printf("我是子进程\n");
		sleep(3);

		//退出子进程
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}

	//使用waitpid以非阻塞的形式回收僵尸进程
	if(waitpid(-1,NULL,WNOHANG)>0)
	{
		printf("成功回收一个僵尸进程\n");
	}
	printf("父进程要结束了\n");
	return 0;
}

5.使用多进程完成两个文件的拷贝,父进程拷贝前一半,子进程拷贝后一半,父进程回收子进程资源。

#include<myhead.h>
//定义获取文件长度的函数
int get_file_len(const char *srcfile,const char *destfile)
{
	//以只读的形式打开源文件
	int srcfd,destfd;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		perror("open srcfile error");
		return -1;
	}
	//以只写和创建的形式打开目标文件
	if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
	{
		perror("open destfile error");
		return -1;
	}
	//求源文件的大小
	int len=lseek(srcfd,0,SEEK_END);

	//关闭两个文件
	close(srcfd);
	close(destfd);

	return len;
}

//定义文件拷贝函数
int copy_file(const char *srcfile,const char *destfile,int start,int len)
{
	//以只读的形式打开源文件,以只写的形式打开目标文件
	int srcfd,destfd;
	if((srcfd=open(srcfile,O_RDONLY))==-1)
	{
		perror("srcfile open error");
		return -1;
	}
	if((destfd=open(destfile,O_WRONLY))==-1)
	{
		perror("destfile open error");
		return -1;
	}

	//移动文件的光标
	lseek(srcfd,start,SEEK_SET);
	lseek(destfd,start,SEEK_SET);

	//完成拷贝工作
	char buf[128]="";
	int sum=0;
	while(1)
	{
		int res=read(srcfd,buf,sizeof(buf));
		sum+=res;//将每次读取的数据放入sum中
		if(sum>=len||res==0)
		{
			write(destfd,buf,res-(sum-len));//将最后一次的内容写入
			break;
		}
		//将读取的数据写入目标文件
		write(destfd,buf,res);
	}

	//关闭文件
	close(srcfd);
	close(destfd);

	return 0;
}
int main(int argc, const char *argv[])
{
	//判断外部传参
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out srcfile destfile\n");
		return -1;
	}

	//定义变量获取源文件长度
	int len=get_file_len(argv[1],argv[2]);

	//创建多进程
	pid_t pid=fork();

	//皮带父子进程
	if(pid>0)
	{
		//父进程
		copy_file(argv[1],argv[2],0,len/2);//父进程拷贝前一半

		//阻塞等待子进程结束
		wait(NULL);
	}
	else if(pid==0)
	{
		//子进程	
		copy_file(argv[1],argv[2],len/2,len-len/2);//子进程拷贝后一半

		//退出进程
		exit(EXIT_SUCCESS);
	}
	else
	{
		perror("fork error");
		return -1;
	}
	printf("拷贝成功\n");
	return 0;
}

6.

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

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

相关文章

【ubuntu】永久修改主机名

文章目录 1. 问题描述2. 解决方案 1. 问题描述 主机名过长&#xff08;后面的部分&#xff09; 2. 解决方案 查看主机名详情 hostnamectl修改指定主机名 hostnamectl set-hostname ubuntu2204 --static登出重进即可

【Java程序设计】【C00279】基于Springboot的智慧外贸平台(有论文)

基于Springboot的智慧外贸平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧外贸平台 本系统分为系统功能模块、管理员功能模块、买家功能模块以及商家功能模块。 系统功能模块&#xff1a;在平台首页可以…

五篇保姆级分类诊断教程,数据特征提取+优化算法+机器学习

今天水一期&#xff0c;总结一下以前写过的几篇保姆级故障诊断。学会这几篇&#xff0c;机器学习的故障诊断你就基本合格了&#xff01; 本期内容&#xff1a;基于SABO-VMD-CNN-SVM的分类诊断。 依旧是采用经典的西储大学轴承数据。基本流程如下&#xff1a; 首先是以最小包络熵…

java spring 01 IOC源码

01.spring 中的基础是IOC

动态规划课堂1-----斐波那契数列模型

目录 动态规划的概念&#xff1a; 动态规划的解法流程&#xff1a; 题目: 第 N 个泰波那契数 解法&#xff08;动态规划&#xff09; 代码&#xff1a; 优化&#xff1a; 题目&#xff1a;最小花费爬楼梯 解法&#xff08;动态规划&#xff09; 解法1&#xff1a; 解…

mybatis中foreach批量插入并返回主键

背景 批量插入多条数据,插入成功之后每条数据中需要返回自增主键.处理办法 1.确定项目中mybatis版本,要求3.3.1以上. 查看springboot中项目版本方法: pom.xml中进入依赖(Ctrl点击进入): <dependency><groupId>org.mybatis.spring.boot</groupId><artifac…

【Flink精讲】Flink 内存管理

面临的问题 目前&#xff0c; 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的&#xff0c;例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理&#xff0c;但同样会面临一个问题&…

【安卓逆向】app防止截屏分析与去除

本次分析的app name为&#xff1a;5paH5qGI54uX 这款应用打开之后里面的内容是不允许截图的&#xff0c;防止截图分析&#xff1a;Android应用防止截屏_landroid/view/window;->setflags 0x2000-CSDN博客 App防止恶意截屏功能的方法&#xff1a;iOS、Android和鸿蒙系统的实…

130.乐理基础-倍增音程、倍减音程

上一个内容&#xff1a;129.乐理基础-曾音程、减音程、等音程-CSDN博客 上一个内容里练习的答案&#xff1a; 倍减音程指的是&#xff1a;比减几度还要小二分之一音数的就叫做倍减几度&#xff0c;如下图 反过来说比增还要打二分之一的是倍增 例子1&#xff1a; 例子2&#xf…

[计网底层小探索]:实现并部署多线程并发Tcp服务器框架(基于生产者消费者模型的线程池结构)

文章目录 一.网络层与传输层协议sockaddr结构体继承体系(Linux体系)贯穿计算机系统的网络通信架构图示: 二.实现并部署多线程并发Tcp服务器框架线程池模块序列化反序列化工具模块通信信道建立模块服务器主体模块任务回调模块(根据具体应用场景可重构)Tips:DebugC代码过程中遇到…

成功解决ModuleNotFoundError: No module named ‘cv2’

&#x1f525; 成功解决ModuleNotFoundError: No module named ‘cv2’ &#x1f525; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 …

如何安装自定义模块?

自定义模块的安装方式如下&#xff1a; 进行了这些操作之后&#xff0c;你就会发现&#xff0c;自己写的代码块&#xff0c;成了可以调用的模块了。

【项目实战】帮美女老师做一个点名小程序(Python tkinter)

前言 博主有一个非常漂亮的老师朋友&#x1f60d;。最近&#xff0c;她急需一个能够实现随机点名的小程序&#xff0c;而博主正好擅长这方面的技术&#x1f90f;。所以&#xff0c;今天博主决定为她制作一个专门用于点名的小程序&#x1f4aa;。 博主在美女老师面前吹完牛皮之…

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后&#xff0c;会返回一个结果给发送者&#xff0c;表示消息是否处理成功。 当消息没有到交换机就失败了&#xff0c;就会返回publish-confirm。当消息没有到达MQ时&…

OT 安全解决方案:探索技术

IT 和 OT 安全的融合&#xff1a;更好的防御方法 OT 安全解决方案下一个时代&#xff1a; 为了应对不断升级的威胁形势&#xff0c;组织认识到迫切需要采用统一的信息技术 (IT) 和运营技术 (OT) 安全方法。IT 和 OT 安全的融合代表了一种范式转变&#xff0c;承认这些传统孤立领…

vue-nextTick(nextTick---入门到离职系列)

官方定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 个人理解 假设我们更改了某个 dom 元素内部的文本&#xff0c;而这时候我们想直接打印这个更改之后的文本是需要 dom 更新之后才会实现的。 小案例 <tem…

WordPress前端如何使用跟后台一样的Dashicons图标字体?

很多站长都喜欢在站点菜单或其他地方添加一些图标字体&#xff0c;常用的就是添加Font Awesome 图标和阿里巴巴矢量库图标iconfont。其实我们使用的 WordPress 本身就有一套管理员使用的官方图标字体 Dashicons&#xff0c;登录我们站点后台就能看到这些图标字体。那么有没有可…

进程间通信——管道错误总结

典型进程间通信方式&#xff1a;管道&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量&#xff0c;网络通信&#xff0c;文件等多种方式 进程A读取B进程中的某个变量&#xff08;非共享内存&#xff09;&#xff0c;可行的方式有&#xff08;&#xff09;[多选] A…

电子器件系列63:肖特基二极管NSQ03A04\SS34C

以下是肖特基二极管_SS34C_规格书_SLKOR(萨科微),立创编号C880740 以下是肖特基二极管NSQ03A04的规格书&#xff1a; 稍微比较下参数&#xff0c;发现两者参数接近&#xff0c;ss34的几个参数还要略微好一些&#xff0c;可以用ss34来作替换。 在电源电路中的应用&#xff1a; …

SAM轻量化的终点竟然是RepViT + SAM

本文首发&#xff1a;AIWalker&#xff0c;欢迎关注~~ 殊途同归&#xff01;SAM轻量化的终点竟然是RepViT SAM&#xff0c;移动端速度可达38.7fps。 对于 2023 年的计算机视觉领域来说&#xff0c;「分割一切」&#xff08;Segment Anything Model&#xff09;是备受关注的一项…