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://www.mzph.cn/news/703040.shtml

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

相关文章

曲线生成 | 图解B样条曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 控制点计算之插值2 控制点计算之近似3 仿真实现3.1 ROS C实现3.2 Python实现3.3 Matlab实现 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&a…

ZYNQ Vivado更新硬件后SDK不更新问题解决办法

一、情况说明 软件版本 Vivado 2018.3 Vivado更新硬件导出后&#xff0c;按正常SDK会自动检测到hdf文件的变化跳出更新提示&#xff08;如下图所示&#xff09;。但是我的项目如果是复制的或者是长时间没打开的项目更新硬件配置导出后SDK无法自动更新。 二、解决办法 2.1 …

win10安装使用AxurePR9

背景&#xff1a;win10 安装、汉化 Axure Pr9 下载 安装包 链接&#xff1a;https://pan.baidu.com/s/1taMgh2zLbaFK7VTfUXTHdQ 提取码&#xff1a;kygo 安装 修改安装目录 打开是英文的 汉化 复制lang包到Axure安装包 再打开就是中文 问题 发布html后火狐无法打开 一、…

数据安全策略

当您在第一线担负着确保公司的信息和系统尽可能免受风险的关键职责时&#xff0c;您的数据安全策略需要复杂且多层次。威胁可能有多种形式&#xff1a;恶意软件、黑客攻击、财务或信息盗窃、破坏、间谍活动&#xff0c;甚至是您信任的员工故意或无意的活动造成的。因此&#xf…

电商风控系统(flink+groovy+flume+kafka+redis+clickhouse+mysql)

一.项目概览 电商的防止薅羊毛的风控系统 需要使用 groovy 进行风控规则引擎的编写 然后其它技术进行各种数据的 存储及处理 薅羊毛大致流程 如果单纯使用 if else在业务代码中进行风控规则的编写 那么 维护起来会比较麻烦 并且跟业务系统强绑定不合适 所以一般独立成一个单…

高效备考2025年AMC8数学竞赛:做熟2000-2024年AMC8真题

这段时间&#xff0c;有小学生的家长朋友问&#xff0c;想给孩子学点数学拓展的知识&#xff0c;不局限于课堂所学。有什么可以推荐的活动或比赛。我个人的建议是可以了解下AMC8美国数学竞赛。主要有以下几个原因&#xff1a; 一是这个竞赛是美国数学协会&#xff08;MAA&…

Linux7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

GEE数据集——全球无缝高分辨率温度数据集(GSHTD)

全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09; 本研究中介绍的全球无缝高分辨率温度数据集&#xff08;GSHTD&#xff09;为各领域的研究人员提供了全面而宝贵的资源。该数据集涵盖 2001 年至 2020 年&#xff0c;主要关注陆地表面温度 (Ts) 和近地面气温 (Ta)。GS…

(每日持续更新)jdk api之ObjectStreamField基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

电子印章系统怎么盖骑缝章?

随着数字化时代的不断发展&#xff0c;电子印章系统在各行各业中得到了广泛应用。其中&#xff0c;骑缝章作为一种常见的复杂印章形式&#xff0c;也在电子印章系统&#xff0c;也额外被读者所关注。电子骑缝章的盖章过程相较于传统的纸质印章&#xff0c;更加简便快捷&#xf…

C++单元测试工具——googletest

在平常的学习和工作中&#xff0c;单元测试是很重要的一环&#xff0c;用于验证代码中最小的可测试单元&#xff08;通常是函数或方法&#xff09;是否按照预期工作&#xff0c;单元测试可以帮助开发人员验证代码的正确性和提高代码的可维护性&#xff0c;确保代码的稳定性和可…

综合服务 IntServ

目录 综合服务 IntServ IntServ 定义的两类服务 IntServ 的四个组成部分 流 (flow) 资源预留协议 RSVP RSVP 协议的工作原理 IntServ 体系结构在路由器中的实现 综合服务 IntServ 体系结构存在的主要问题 综合服务 IntServ 综合服务 IntServ (Integrated Services) 可…

力扣随笔删除有序数组中的重复项(简单26)

思路&#xff1a;根据类似于滑动窗口的思想&#xff0c;定义一个指针&#xff1b;使指针左边的区域全部为不重复元素&#xff08;包括指针所指的数字&#xff09; 以示例2为例&#xff0c;left&#xff1a;红色加粗 遍历指针i&#xff1a;黑色加粗 窗口范围&#xff0c;左边界到…

区分服务 DiffServ

目录 区分服务 DiffServ 区分服务的基本概念 区分服务 DiffServ 的要点 每跳行为 PHB DiffServ 定义的两种 PHB 区分服务 DiffServ 区分服务的基本概念 由于综合服务 IntServ 和资源预留协议 RSVP 都较复杂&#xff0c;很难在大规模的网络中实现&#xff0c;因此 IET…

基于Prony算法的系统参数辨识matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Prony算法是一种用于信号处理和系统辨识的经典方法&#xff0c;特别适用于线性时不变系统&#xff08;LTI&#xff09;的频率响应分析以及模拟复指数信号序列。其…

golang通过http访问外部网址

不同项目之前,通过http访问,进行数据沟通 先设定一个接口,确认外部能访问到 PHP写一个接口 public function ceshi_return() {$data $this->request->param();$id $data[id];$res Db::name(user)->field(id,status,price,name)->where([id>$id])->find…

无人集群试验评估现状及技术方法综述

源自&#xff1a;系统工程与电子技术 作者&#xff1a;赵蕊蕊, 于海跃, 游雅倩, 张涛, 陶敏, 姜江 “人工智能技术与咨询” 发布 摘 要 试验评估是促进装备系统作战能力生成和实战化应用的重要手段。无人集群依靠自组网实现复杂交互, 具备典型的智能性和涌现性, 开展无人集…

深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息&#xff1a;International Journal of Multiphase Flow 2023 级别&#xff1a;EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&q…

VSCode远程开发 Windows11 Linux

问题背景 之前一直用JetBrains的Gateway和本地Linux虚拟机开发&#xff0c;不过笔记本配置不够&#xff0c;太卡了。最近租了个国外的便宜服务器&#xff0c;JetBrains的Gateway总断连&#xff0c;也不知道为什么&#xff0c;所以试试VSCode。 本地 Windows 11 &#xff0c;远…