IO进程线程复习:进程线程

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.守护进程的创建

#include<myhead.h>int main(int argc, const char *argv[])
{//创建子进程pid_t pid=-1;pid=fork();//判断if(pid>0){//父进程exit(EXIT_SUCCESS);}else if(pid==0){//子进程//1.将组id和会话id改成自己setsid();//2.更改操作目录为根目录chdir("/");//3.修改创建文件的掩码umask(0);//4.将标准输入、标准输出和标准出错重定向到指定文件int fd=-1;if((fd=open("./logtest.txt",O_RDWR|O_CREAT|O_APPEND))==-1){perror("open error");return -1;}dup2(fd,0);dup2(fd,1);dup2(fd,2);while(1){printf("hello world\n");fflush(stdout);//刷新缓冲区sleep(1);}}else{perror("fork error");return -1;}return 0;
}

7.创建多线程

#include<myhead.h>
//定义分之线程
void *task(void *arg)
{while(1){printf("我是分支线程\n");sleep(1);}
}
int main(int argc, const char *argv[])
{//定义一个线程号变量pthread_t tid=-1;//创建线程if((pthread_create(&tid,NULL,task,NULL))!=0){printf("pthread_creat error\n");return -1;}//下面的程序是主线程内容while(1){printf("我是主线程,tid=%ld\n",tid);sleep(1);}return 0;
}

8.多线程的综合应用

#include<myhead.h>
//定义分支线程
void *task(void *arg)
{while(1){printf("我是分支线程,tid=%#lx\n",pthread_self());sleep(3);//退出线程pthread_exit(NULL);printf("111111111111111\n");}
}
int main(int argc, const char *argv[])
{//定义一个线程号变量pthread_t tid=-1;//创建线程if((pthread_create(&tid,NULL,task,NULL))!=0){printf("pthread_create error\n");return -1;}//下面的程序是主线程的内容printf("我是主线程,tid=%#lx,主线程号:%#lx\n",tid,pthread_self());//回收线程退出的资源,阻塞等待对应的线程退出if(pthread_join(tid,NULL)==0){printf("成功回收了一个线程\n");}//将线程设置程分离态pthread_detach(tid);printf("主线程要退出了\n");sleep(5);return 0;
}

9.向指定线程发送取消信号

#include<myhead.h>
//定义分支线程1
void *task1(void *arg)
{while(1){printf("我是线程1,我想活着\n");sleep(1);}
}
//定义分支线程2
void *task2(void *arg)
{while(1){//设置忽略取消信号if(pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL)!=0){printf("set error\n");return NULL;}printf("我是线程2,我想活着\n");sleep(1);}
}int main(int argc, const char *argv[])
{//定义线程号变量pthread_t tid1,tid2;//创建两个线程if(pthread_create(&tid1,NULL,task1,NULL)!=0){printf("pthread_create tid1 error\n");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){printf("pthread_create tid2 error\n");return -1;}//主线程printf("tid1=%#lx,tid2=%#lx\n",tid1,tid2);sleep(5);printf("线程1可以死了\n");pthread_cancel(tid1);sleep(5);printf("线程2也可以死了\n");pthread_cancel(tid2);//回收线程资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

10.向分支线程中传递数据

#include<myhead.h>
//定义要传递的结构体类型
struct Info
{char *p;char *q;int s;int l;int value;
};//定义全局变量
int key=1314;//定义分支线程
void *task(void *arg)
{printf("key=%d\n",++key);//处理主线程中传过来的数据struct Info buf=*((struct Info*)arg);printf("buf.p=%s,buf.q=%s,buf.s=%d,buf.l=%d\n",buf.p,buf.q,buf.s,buf.l);//想要将分支线程中的数据传给主线程(*((struct Info*)arg)).value=5201314;
}
int main(int argc, const char *argv[])
{pthread_t tid;int num=520;//要传递给分支线程的数据char *srcfile="./02text.txt";char *destfile="./17test.txt";int start=0;int len=520;//定义一个结构体变量struct Info buf={srcfile,destfile,start,len};//创建线程if(pthread_create(&tid,NULL,task,&buf)!=0)//向分支线程传递一个数据{printf("tid create error\n");return -1;}//主线程中使用全局变量printf("key=%d\n",++key);sleep(1);//输出分支线程给的数据printf("buf.value=%d\n",buf.value);//回收资源pthread_join(tid,NULL);return 0;
}

11.使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程回收两个线程的资源。

#include<myhead.h>
//创建结构体用于主线程往分支线程传参
typedef struct Info
{int length;const char *src;const char *dest;
}SI;
int get_file_len(const char *srcfile,const char *destfile);
int copy_file(const char *srcfile,const char *destfile,int start,int len);//创建子线程1
void *task1(void *arg)
{copy_file(((SI *)arg)->src,((SI *)arg)->dest,0,((SI *)arg)->length/2);//子线程1拷贝前一半pthread_exit(NULL);//退出线程
}
//创建子线程2
void *task2(void *arg)
{copy_file(((SI *)arg)->src,((SI *)arg)->dest,((SI *)arg)->length/2,((SI *)arg)->length-((SI *)arg)->length/2);//子线程2拷贝后一半pthread_exit(NULL);//退出线程
}
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]);//定义结构体并初始化SI *file=(SI *)malloc(sizeof(struct Info));file->length=len;file->src=argv[1];file->dest=argv[2];//定义两个线程号变量pthread_t tid1,tid2;//创建线程if(pthread_create(&tid1,NULL,task1,file)!=0){perror("tid1 create error\n");return -1;}if(pthread_create(&tid2,NULL,task2,file)!=0){perror("tid2 create error\n");return -1;}//回收资源pthread_join(tid1,NULL);pthread_join(tid2,NULL);//释放结构体内存free(file);file=NULL;return 0;
}//定义获取文件长度的函数
int get_file_len(const char *srcfile,const char *destfile)
{//以只读的形式打开源文件int srcfd,destfd;if((srcfd=open(srcfile,O_RDONLY))==-1){perror("srcfile open error\n");return -1;}//以只写和创建的形式打开目标文件if((destfd=open(destfile,O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("destfile open error\n");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\n");return -1;}if((destfd=open(destfile,O_RDWR))==-1){perror("destfile open error\n");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);
}

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

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

相关文章

[第一章 web入门]SQL注入-1 题目分析与详解

一、题目简介&#xff1a; 题目来源&#xff1a;BUUCTF网址 题目介绍如图&#xff1a;获取flag值。 二、解题思路&#xff1a; 首先看到题目主页面有一段文字&#xff0c;貌似没有什么作用&#xff0c;我们先使用HackBar导入URL。 我们发现?id1&#xff0c;可知这是一个很基…

小猫咪不喝水怎么办?主食冻干、主食罐头喂养从饮食上给猫咪补水

小猫咪不喝水怎么办&#xff1f;它们会不会在感到口渴、缺水时自己去寻找水喝呢&#xff1f;猫的祖先是来自沙漠的猫科动物&#xff0c;在沙漠几乎找不到水源&#xff0c;因此它们进化出了“低渴感”&#xff0c;并且它们的肾脏进化出了浓缩水分再吸收的功能&#xff0c;使得猫…

安全测试工具之nmap使用指南

文章目录 一、前言二、简介三、使用示例&#xff08;一&#xff09;常用命令&#xff08;二&#xff09;主机存活检测&#xff08;三&#xff09;端口探测&#xff08;四&#xff09;服务识别&#xff08;五&#xff09;操作系统识别 三、其它 一、前言 当我们在构建环境或排查…

怎么使用Python轻松打造淘宝主图视频生成神器

目录 一、引言 二、淘宝主图视频的重要性 三、Python打造淘宝主图视频生成神器的步骤 1. 准备工作 2. 收集素材 3. 制作视频 4. 调整和优化 5. 上传至淘宝 四、案例分享 五、总结 一、引言 随着电子商务的飞速发展&#xff0c;淘宝作为中国最大的网络购物平台之一&am…

【非递归版】归并排序算法(2)

目录 MergeSortNonR归并排序 非递归&归并排序VS快速排序 整体思想 图解分析​ 代码实现 时间复杂度 归并排序在硬盘上的应用&#xff08;外排序&#xff09; MergeSortNonR归并排序 前面的快速排序的非递归实现&#xff0c;我们借助栈实现。这里我们能否也借助栈去…

Qt QWiget 实现简约美观的加载动画 第三季

&#x1f603; 第三季来啦 &#x1f603; 这是最终效果: 只有三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QVBoxLayout> #include <QGridLayout> int main(int argc, char *argv[]…

一款.NET下 WPF UI框架介绍

WPF开源的UI框架有很多,如HandyControl、MahApps.Metro、Xceed Extended WPF Toolkit™、Modern UI for WPF (MUI)、Layui-WPF、MaterialDesignInXamlToolkit、等等&#xff0c;今天小编带大家认识一款比较常用的kaiyuanUI---WPF UI&#xff0c;这款ui框架美观现代化&#xff0…

使用单一ASM-HEMT模型实现从X波段到Ka波段精确的GaN HEMT非线性仿真

来源&#xff1a;Accurate Nonlinear GaN HEMT Simulations from X- to Ka-Band using a Single ASM-HEMT Model 摘要&#xff1a;本文首次研究了ASM-HEMT模型在宽频带范围内的大信号准确性。在10、20和30 GHz的频率下&#xff0c;通过测量和模拟功率扫描进行了比较。在相同的频…

端口映射教程?

端口映射是一种网络技术&#xff0c;用于在公网与内网之间建立网络连接。在互联网中&#xff0c;设备通过IP地址和端口号进行通信&#xff0c;而内网中的设备通常被分配了私有IP地址&#xff0c;无法直接被公网访问。端口映射可以将公网的请求转发到内网中的设备&#xff0c;从…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

汇总利用YOLO8训练遇到的报错和解决方案(包含训练过程中验证阶段报错、精度报错、损失为Nan、不打印GFLOPs)

一、本文介绍 本文为专栏内读者和我个人在训练YOLOv8时遇到的各种错误解决方案,你遇到的问题本文基本上都能够解决,同时本文的内容为持续更新,定期汇总大家遇到的问题已经一些常见的问题答案,目前包含的问题已经解决方法汇总如下图所示。 专栏目录:YOLOv8改进有效系列目录…

机器人内部传感器阅读笔记及心得-位置传感器-旋转变压器、激光干涉式编码器

旋转变压器 旋转变压器是一种输出电压随转角变化的检测装置&#xff0c;是用来检测角位移的&#xff0c;其基本结构与交流绕线式异步电动机相似&#xff0c;由定子和转子组成。 旋转变压器的原理如图1所示&#xff0c;定子相当于变压器的一次侧&#xff0c;有两组在空间位置上…

Python及Pycharm专业版下载安装教程(Python 3.11版)附JetBrains学生认证教程

目录 一、Python下载及安装1、Python下载2、Python安装3、验证是否安装成功 二、PyCharm下载及安装1、PyCharm下载2、PyCharm安装3、激活PyCharm 三、JetBrains学生认证 本篇主要介绍Python和PyCharm专业版的下载及安装方式&#xff0c;以及通过两种方式进行JetBrains学生认证。…

CAS5.3使用JPA实现动态注册服务

cas同时支持cas协议和OAuth2协议,官方默认是通过扫描json文件的形式注册客户端服务,但是此种方式需要重启服务才能生效,此次我们将使用JPA来完美实现动态注册服务,如果不知道cas如何部署,可以擦看之前的文章 cas-client基于CAS协议客户端搭建-CSDN博客 cas-server5.3自定义密…

家用超声波清洗机哪个好?四款高评分超声波清洗机分享

超声波清洗机可以说是眼镜党家中必备的一款超声波清洗机&#xff0c;毕竟它能高效的帮我们解决清洗眼镜的烦恼&#xff0c;也可以帮我们清洗家中其他的一些物品。很多朋友因为各种原因没有时间清洗眼镜以及家中的小物件物品&#xff0c;长时间下来一次物品或者是眼镜上就会堆积…

构建高效稳定的外卖平台架构设计与实现

外卖行业的快速发展为人们的生活带来了便利&#xff0c;随着外卖市场的扩大和竞争的加剧&#xff0c;外卖平台的架构设计变得至关重要。一个高效稳定的架构可以支持平台的快速发展&#xff0c;提供优质的服务体验&#xff0c;同时保障用户数据的安全性。 用户端架构设计 移动端…

【C#】获取文本中的链接,通过正则表达式的方法获取以及优化兼容多种格式

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

淘宝京东1688实时API商品详情数据解析:获取市场最新趋势

实时API商品详情数据解析&#xff1a;获取市场最新趋势 在快速变化的商业环境中&#xff0c;实时数据成为企业把握市场动态和竞争优势的关键。特别是对于电商行业而言&#xff0c;实时API商品详情数据成为了获取市场最新趋势的重要工具。本文将深入探讨如何通过实时API商品详情…

HTTPS对HTTP的加密过程

1、HTTPS是在HTTP的基础上&#xff0c;引入了一个加密层&#xff08;SSL&#xff09;&#xff0c;对数据进行保护&#xff0c;HTTP 是明文传输的&#xff08;不安全&#xff0c;很可能会被运营商通过referer劫持&#xff0c;或者黑客通过修改链接来窃数据&#xff09; 2、加密…

计网:动手尝试SMTP交互【利用Telnet发送邮件, 带图片】

文章目录 准备工作发送仅有ascii码的邮件发送图片附件后记 准备工作 1.如图&#xff0c;勾选telnet客户端 2.邮箱开启第三方登录服务 开启服务后&#xff0c;会给一个授权码。授权码是QQ邮箱用于登录第三方客户端/服务的专用密码&#xff0c;适用于登录以下服务&#xff1a;…