当前位置: 首页 > news >正文

笔记整理—linux进程部分(2)使用fork创建进程

        为什么要创建进程,首先每个程序的运行都需要一个进程;多进程实现宏观上的并行。

        fork的原理,是进程的分裂生长模式。如果操作系统需要一个新的进程,那么就会以cp的方法得到一个新的进程,此时老的进程是父进程,新的进程为子进程。

        pid_t fork(void),fork被调用一次会返回两次,返回0为子进程,大于0为父进程。

int main()
{printf("a.out\n");pid_t p1=-1;p1=fork();if(0==p1)
{printf("son  ");
}
if(0<p1)
{printf("father  ");
}printf("pid=%d\n",getpid());
}如果p1<0 fork则会错误

        两个printf分别是父进程于子进程的,但是父进程不一定在子进程之前执行。

        所以在运行时候要用if去判断谁是父进程,谁是子进程,子进程与父进程的分道扬镳之处就在fork()之后的部分。在父进程中,当if(p1>0)中的p1值为返回子进程的PID,父进程中fork返回值为子进程的PID,子进程中fork的返回值为0,父进程中PID返回值为子进程的ID,子进程使用getppid()得到父进程的ID。

        若父进程消亡,则getppid()返回用户的init进程,原因就是父进程消亡会上交进程号给init进程(user)。

        一但fork成功,则子进程与父进程将独立运行,有各自的PCB,父进程与子进程在内核中等待调度的机会。

        父进程对文件的操作问题:①子进程中会继承父进程打开的文件。正常情况下,父进程打开一个文件,fork创建子进程后,父子进程对文件的write是接续的,因为,lseek是关联的,像O_APPEND,但有时又只会有父子进程中的其中之一的内容,原因是父进程或子进程其中一个关闭文件过快,其中一个还没写完,就找不到入口了为了避免这一情况的发送,就可用通过信号或sleep函数实现延时关闭。

        ②父进程都去打开文件,正常情况下,分别写各自的文件表,有各自的lseek可以用O_APPEND实现关联,否则你写你的我写我的谁最后写就留下谁的文件。

        父进程在fork前干的事情是会影响到子进程的,只有在if的部分才是独立的,本质上希望子进程去干自己的活,不是两方干一模一样的活,还不如复制粘贴。

        进程消亡:①进程在运行过程中,占用看内存和IO,进程终止时才会完全释放这些资源。僵尸进程是指子进程先于父进程,每个进程在推出时,操作系统会回收资源,如当malloc没free,open没close都会在进程结束时候回收,但财政系统只回收了运行时消耗的内存与IO,没回收task_struct和栈内存。自身的8kb内存是无法自己回收的,使用要个收尸的,这个进程就是父进程,子进程结束父进程还没结束,这段时间就是僵尸进程。

        ②父进程调用wait()或waitpid()以显示的方式去收尸。

        ③父进程结束时,会在不调用wait/waitpid的情况下进行子进程的收尸操作,本质上是为了防止父进程忘记显示调用,防止内存泄漏。

        孤儿进程,父进程先于子进程消亡,Linux、将所有孤儿进程归于进程1的子进程。

相关文章:

  • 尚品汇-自动化部署-Jenkins的安装与环境配置(五十六)
  • 十分钟实现内网连接,配置frp
  • JavaWeb图书借阅系统
  • MapBox Android版开发 6 关于Logo
  • [java][代码]DateUtil用于处理日期和时间
  • excel怎么转换json
  • C++初阶:STL详解(九)——stacke和queue的模拟实现
  • kmeans聚类分析 生活使用案例
  • 解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题
  • Java之多态
  • 关于贪心算法
  • 【系统交付资料】软件文档交付清单整理套用原件(Word,PPT,Excel)
  • 企业如何保护自身通信渠道被黑客攻击
  • 【蚂蚁HR-注册/登录安全分析报告】
  • kubernetes存储入门(kubernetes)
  • 深入了解以太坊
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2017年终总结、随想
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • github指令
  • Java IO学习笔记一
  • javascript数组去重/查找/插入/删除
  • java第三方包学习之lombok
  • JS函数式编程 数组部分风格 ES6版
  • Linux各目录及每个目录的详细介绍
  • Python_OOP
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SOFAMosn配置模型
  • XForms - 更强大的Form
  • 百度小程序遇到的问题
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 关于Java中分层中遇到的一些问题
  • ------- 计算机网络基础
  • 使用权重正则化较少模型过拟合
  • 协程
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # Apache SeaTunnel 究竟是什么?
  • # 数仓建模:如何构建主题宽表模型?
  • #Java第九次作业--输入输出流和文件操作
  • #mysql 8.0 踩坑日记
  • #pragma 指令
  • $ git push -u origin master 推送到远程库出错
  • $GOPATH/go.mod exists but should not goland
  • (1)(1.9) MSP (version 4.2)
  • (2020)Java后端开发----(面试题和笔试题)
  • (27)4.8 习题课
  • (7)摄像机和云台
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)pulsar安装在独立的docker中,python测试
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (十五)Flask覆写wsgi_app函数实现自定义中间件