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.hqwc.cn/news/491817.html

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

相关文章

Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)

上篇文章介绍了openpose&#xff0c;本篇文章介绍下线稿约束&#xff0c;关于线稿约束有好几个处理器都属于此类型&#xff0c;但是有一些区别。 包含&#xff1a; 1、Canny(硬边缘&#xff09;&#xff1a;识别线条比较多比较细&#xff0c;一般用于更大程度得还原照片 2、ML…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Inpaint)

上篇文章介绍了语义分割Tile/Blur&#xff0c;这篇文章介绍下Inpaint&#xff08;重绘&#xff09; Inpaint类似于图生图的局部重绘&#xff0c;但是Inpain效果要更好一点&#xff0c;和原图融合会更加融洽&#xff0c;下面是案例&#xff0c;可以看下效果&#xff08;左侧原图…

哪些行业适合做小程序?零售电商、餐饮娱乐、旅游酒店、教育生活、医疗保健、金融社交、体育健身、房产汽车、企管等,你的行业在其中么?

引言 在当今数字化时代&#xff0c;小程序成为了各行各业快速发展的数字工具之一。它的轻便、灵活的特性使得小程序在多个行业中找到了广泛的应用。本文将探讨哪些行业适合开发小程序&#xff0c;并介绍各行业中小程序的具体应用。 一、零售和电商 在当今数字化的商业环境中&…

【每日一题】938. 二叉搜索树的范围和-2024.2.26

题目&#xff1a; 938. 二叉搜索树的范围和 给定二叉搜索树的根结点 root&#xff0c;返回值位于范围 [low, high] 之间的所有结点的值的和。 示例 1&#xff1a; 输入&#xff1a;root [10,5,15,3,7,null,18], low 7, high 15 输出&#xff1a;32示例 2&#xff1a; 输入…

综合服务 IntServ

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

linux系统消息中间件rabbitmq普通集群的部署

rabbitmq普通集群的部署 普通集群准备环境查询版本对应安装rabbitmq软件启动创建登录用户开启用户远程登录查看端口 部署集群创建数据存放目录和日志存放目录:拷⻉erlang.cookie将其他两台服务器作为节点加⼊节点集群中查看集群状态创建新的队列 普通集群准备环境 配置hosts⽂件…

沃飞长空与昂际航电签署战略合作,加快eVTOL商业化进程

2024年2月20日&#xff0c;世界三大航展之一的新加坡航展隆重开幕&#xff0c;来自世界各地的民用飞机、航空材料、航空电子设备和技术、航天制造等相关企业齐聚一堂&#xff0c;探讨航空事业的未来发展。 双方嘉宾在GE航空航天展台前合影 开幕当天&#xff0c;国内领先的eVTO…

OJ练习题——数组形式的整数加法

整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组形式 &#xff0c;和整数 k &#xff0c;返回 整数 num k 的 数组形式 。 示例 1&#xff1a; 输入&…

Nest.js权限管理系统开发(六)新建模块

本文相关文档&#xff1a;NestJS 中文网 创建模块 nest g命令 我们知道一个模块往往包含controller、module、service等文件&#xff0c;为了方便我们创建这些文件&#xff0c;nest cli提供了一些命令&#xff1a; 生成模块 (nest g mo) 以保持代码井井有条并建立清晰的边界…

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…

高效!中科院2区SCI,不到两个月录用!审稿人很给力!

【SciencePub学术】 JOURNAL OF ENVIRONMENTAL SCIENCES IF(2022)&#xff1a;6.9&#xff0c;JCR1区&#xff0c;中科院2区 数 期刊数据指标 ISSN&#xff1a;1001-0742 IF(2022)&#xff1a;6.9 自引率&#xff1a;4.30% 年发文量&#xff1a;300篇左右 国人占比&…

openeuler欧拉系统 在windows10上安装报错0xc03a001a

openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、人工智能等应用场景。…