【Linux系统化学习】进程的父子关系 | fork 进程

=========================================================================

个人主页点击直达:小白不是程序媛

Linux专栏:Linux系统化学习

=========================================================================

目录

前言:

父子进程

父子进程的引入

查看父子进程 

查询进程的动态目录

更改进程的工作目录

fork创建进程

fork的引入

fork的使用

fork的原理

fork如何实现的?

为什么fork之前的代码不执行?

为什么要有两个返回值?


前言:

上篇文章我们谈到了进程,运行在内存的程序、被执行的指令都可以是一个进程;并且对Linux的进程有一定的认识,知道如何使用指令查看进程和第一个系统调用。进程还有很多的奥秘需要我们探索,让我们开始今天的学习吧!


父子进程

父子进程的引入

还是上篇文章的代码和指令,每个进程都PID,在属性列表前面的PPID父进程的ID。

我们对自己写的可执行程序进行多次的运行和终止,会发现每次的进程ID都会变,而父进程ID始终不变。 

 经过查询我们可以知道这个父进程就是我们的命令行解释器(bash)

总结:

  • 启动进程本质就是创建进程,一般是通过父进程创建的(父子关系)
  • 我们命令行启动的进程都是bash的子进程

查看父子进程 

新的进程创建时操作系统会给每个进程创建一个task_struct(PCB),里面存放着关于这个进程的各种信息、属性等;其中就包括PIDPPID是操作系统内部的数据,操作系统那片文章我们提到用户是无法拿到操作系统内部的数据的要通过系统调用才可以,Linux也给我们提供了相应的函数接口供我们使用。

  • 获取子进程ID:getpid()
  • 获取父进程ID:getppid()

通过man指令可以查询到这两个函数的使用方法。

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 5 {6     printf("我是一个进程,我的PID为:%d;我的PPID为:%d\n",getpid(),getppid());                                                                                                     7     return 0;8 }

 

通过编写代码,函数调用获取我们的ID和PPID。 

查询进程的动态目录

Linux操作系统下有一个有一个动态目录结构存放着所有进程;可以通过每个进程的PID查询到这个目录

  • 指令: proc/PID

我们将整个进程的完整目录调出来

更改进程的工作目录

我们可以使用chdir()修改当前工作目录

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 5 {6     chdir("/root");                                                                   7     while(1)8     {9     printf("我是一个进程,我的PID为:%d;我的PPID为:%d\n",getpid(),getppid());10     sleep(1);11     }12     return 0;13 }

 


fork创建进程

fork的引入

在Linux操作系统下有两种创建进程的方式

  • 命令行中直接启动进程(手动启动)
  • 通过代码来创建进程(fork)

我们一直在使用第一种方式创建进程,下面将通过演示fork来创建进程。

fork的使用

man fork 查看fork如何使用

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 5 {6     printf("我是一个进程,我的PID为:%d;我的PPID为:%d\n",getpid(),getppid());7     fork();8 9     printf("我是一个进程,我的PID为:%d;我的PPID为:%d\n",getpid(),getppid());10     sleep(1);                                                                         11     return 0;12 }

 

运行我们编译好的程序我们发现同一条输出语句运行了两次。这是因为在fork之前只有一个进程,fork创建了一个进程,所以才会执行两次。

fork的原理

fork如何实现的?

fork是一个函数,函数可以设置返回值;当fork子进程成功时给父进程返回子进程的PID,给子进程返回0;fork子进程失败时返回-1;子进程创建成功后会将fork下面的代码拷贝一份,相当有两个进程执行同一份代码,因此会输出两条语句。

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 5 {6     pid_t id =fork();7     if(id<0)8     {9          return 0;10     }11     else if ( id == 0 )12     {13         while(1)14         {15             printf("我是子进程,我的Pid为:%d,我的PPid为:%d\n",getpid(),getppid());16         }17         sleep(1);18     }19     else                                                                              20     {21 22         while(1)23         {24             printf("我是父进程,我的Pid为:%d,我的PPid为:%d\n",getpid(),getppid());25         }26         sleep(1);27     }28     return 0;29 }

 

为什么fork之前的代码不执行?

在学习C语言的时候我们知道,代码执行的时候会有一个指针执行一条语句,指针就会随着变化;执行到fork时候,指针也变化到fork语句;因此只能将fork之后的语句拷贝给另一个进程。

为什么要有两个返回值?

这和我们用户使用计算机的场景有关,就像我现在在同一个浏览器里一边在CSDN写着博客,一边还在查找相关的资料。浏览器这一个进程含有两个进程,两个进程做着不同的事情,甚至更多。但是当前我们只能让做相同的事情,执行同一份代码。在以后的学习中我们会通过返回值让他们执行不同的代码片段。


今天对Linux下父子进程和fork进程的介绍分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法。您三连的支持就是我前进的动力,感谢大家的支持!!!

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

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

相关文章

PS学习笔记——图层

文章目录 图层面板图层类型新建图层新建方式图层颜色 操作图层修改图层名称选中图层隐藏图层调整图层顺序复制图层 图层面板 按F7可打开/关闭图层面板 该面板就是图层面板了 对所有图层进行筛选的按钮&#xff0c;第一个搜索框可以选择按什么方式进行筛选&#xff0c;支持&am…

html-网站菜单-点击显示导航栏

一、效果图 1.点击显示菜单栏&#xff0c;点击x号关闭&#xff1b; 2.点击一级菜单&#xff0c;展开显示二级&#xff0c;并且加号变为减号&#xff1b; 3.点击其他一级导航&#xff0c;自动收起展开的导航。 二、代码实现 <!DOCTYPE html> <html><head>&…

首尔市立大学经营学专业介绍,柯桥留学韩语培训

首尔市立大学成立于1918年&#xff0c;位于韩国首尔特别市&#xff0c;是韩国国内一所综合性公立大学&#xff0c;2022QS世界大学排名位列801-1000名区间。近年来因为实行“半价学费”策略&#xff0c;得到首尔市政府的大力支持&#xff0c;通过大幅提高高考分数&#xff0c;吸…

IDEA导入jar包

通过maven导入本地包 mvn install:install-file -DfileD:\WebProject\ERP\zhixing-heyue-erp-server\zxhy-service-api\src\main\java\com\zxhy\service\api\invoice\baiwang\lib\com_baiwang_bop_sdk_outer_3_4_393.jar -DgroupIdcom.baiwang -DartifactIdbaiwang.open -Dver…

力扣labuladong一刷day11拿下打家劫舍问题共3题

力扣labuladong一刷day11拿下打家劫舍问题共3题 文章目录 力扣labuladong一刷day11拿下打家劫舍问题共3题一、198. 打家劫舍二、213. 打家劫舍 II三、337. 打家劫舍 III 一、198. 打家劫舍 题目链接&#xff1a;https://leetcode.cn/problems/house-robber/ 思路&#xff1a;打…

【项目管理】PMO技能树21项参照

导读&#xff1a;PMO技能树让你能够有全局视野&#xff0c;让你对照着检查自己的能力是否掌握。技能树提供了构建个人知识体系参照和地图导航&#xff0c;不至于迷失方向。 目录 1、PMO层次概览 2、技能树 2.1 项目管理流程 2.2 项目组合管理 2.3 风险管理 2.4 项目资源管…

leetcode做题笔记2736. 最大和查询

给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j] > yi 的下标 j (0 < j < n) …

Redis:java和SpringBoot中使用Redis

目录 Jedis操作Redis6SpringBoot整合Redis Jedis操作Redis6 Jedis是java开发的操作redis的工具包。 引入maven依赖&#xff1a; <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.1</ve…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(6)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

WPF中如何在MVVM模式下关闭窗口

完全来源于十月的寒流&#xff0c;感谢大佬讲解 使用Behaviors <Window x:Class"Test_03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:b"http://schemas.microsoft.com/xaml/behaviors"xmlns:x&quo…

使用ADS进行serdes仿真时,Tx_Diff中EQ的设置对发送端波形的影响。

研究并记录一下ADS仿真中Tx_Diff的EQ设置。原理图如下&#xff1a; 最上面是选择均衡方法Choose equalization method&#xff1a;Specify FIR taps&#xff0c;Specify de-emphasis和none。 当选择Specify de-emphasis选项时&#xff0c;下方可以输入去加重具体的dB值&#x…

市级奖项+1,持安获「创业北京」创业创新大赛优秀奖!

2274个创业项目参赛 历经五个多月的激烈角逐 第六届“创业北京”创业创新大赛 终于圆满落下帷幕 持安科技在北京市总决赛中再创佳绩&#xff01; 荣获制造业赛道优秀奖 本次大赛由北京市人力资源和社会保障局、北京市发展和改革委员会等11家单位联合主办&#xff0c;以“创…

hive sql 取当周周一 str_to_date(DATE_FORMAT(biz_date, ‘%Y%v‘), ‘%Y%v‘)

select str_to_date(DATE_FORMAT(biz_date, %Y%v), %Y%v)方法拆解 select DATE_FORMAT(now(), %Y%v), str_to_date(202346, %Y%v)

【PG】PostgreSQL高可用方案repmgr管理之配置文件

1 配置文件 1.1 配置文件格式 repmgr.conf是一个纯文本文件&#xff0c;每行包含一个参数/值组合。 空格是无关紧要的&#xff08;除了在带引号的参数值内&#xff09;&#xff0c;并且空行将被忽略。#将该行的其余部分指定为注释。不是简单标识符或数字的参数值应该用单引号…

鉴源实验室 | DoIP协议网络安全攻击

作者 | 付东杰 上海控安可信软件创新研究院工控网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 背 景 随着科技的迅猛发展&#xff0c;汽车行业正经历着前所未有的数字化变革。现代汽车中使用70多个电子控制单元&#x…

knex事务

1.数据库事务 在执行SQL语句时&#xff0c;某些业务要求&#xff0c;一系列操作必须全部执行&#xff0c;而不能仅执行一部分。例如&#xff0c;一个转账操作&#xff1a; 从id1的账户给id2的账户转账100元 -- 第一步&#xff1a;将id1的A账户余额减去100 UPDATE accounts S…

uniapp中的H5页面微信浏览器中禁止下拉出现网页由xxx.xxxxx.com提供,QQ浏览器X5内核提供技术支持这个

在App.vue文件中的onLaunch函数新增如下 onLaunch: function () {console.log(App Launch);document.body.addEventListener(touchmove,function (e) {e.preventDefault();},{ passive: false });},

数据的存储--MongoDB文档存储

MongoDB文档存储 NoSQL&#xff0c;全称为Not Only SQL&#xff0c;意为不仅仅是SQL&#xff0c;泛指非关系型数据库。NoSQL是基于键值对的&#xff0c;而且不需要经过SQL层的解析&#xff0c;数据之间没有耦合性&#xff0c;性能非常高。 非关系行数据库又可细分如下。 键值存…

【入门篇】1.2 Redis 客户端之 Jedis 详解和示例

文章目录 1. 简介2. Jedis的依赖下载Jedis导入Jedis jar包配置Redis服务器的地址和端口 3. Jedis 的基本操作连接 Redis 服务器设置和获取字符串类型的键值对判断键是否存在删除键设置键的过期时间 4. Jedis 的数据类型操作字符串类型列表类型集合类型哈希类型有序集合类型 5. …

YOLOv5独家原创改进:最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5独家原创改进:独家首发最新原创WIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能精度。 💡对自己数据集改进有效…