【Linux】进程的初步认识(二)

news2024/11/27 12:45:39

进程的初步认识

  • 前言
  • 查看进程
  • 通过系统调用创建进程
    • 关于创建进程的几点补充

前言

  之前的一篇文章(文章链接)已经初步对于进程有了一个认识,这篇文章主要是介绍如何去查看进程的相关信息以及创建一个进程的相关知识

查看进程

  查看进程的信息可以在/proc系统文件夹中查看
在这里插入图片描述
  当然也可以通过ps或者top指令来获取进程的信息,常见的指令就是ps -axj
在这里插入图片描述
  上一篇文章已经提到如何去利用函数去获取一个进程的id,那么我们就可以通过获取到的进程id去观察我们自己写的代码所对应的进程
  首先,先写一个一个简单的代码
在这里插入图片描述
  然后,我们再根据代码运行起来时打印出来的进程id去/proc系统文件夹查看对应的进程信息
在这里插入图片描述
  即使在众多的进程信息中,我们也可以很轻易地发现有两个特别“突出“的两条
在这里插入图片描述
在这里插入图片描述
  exe其实就是该进程所依赖的可执行程序
  cwd(Current working directory)代表的就是当前工作目录,那么这个作用主要是什么呢?
首先可以回忆以下C语言的文件操作的一些知识,当我们写下以下代码

FILE * pFile;
pFile = fopen ("myfile.txt","w");

  其中fopen的第一个参数是可以填一个绝对路径或者是填一个相对路径的,我们都知道当我们填了一个相对路径时,比如这个例子中的,操作系统就会在当前的目录查找是否有myfile.txt这个文件,如果没有的话就会在当前目录创建一个
  其实,操作系统之所以会在当前目录创建文件其实就是因为该代码所对应进程中包含了相关工作目录的信息,当我们输入一个相对路径的时候,操作系统用这个cwd的信息帮我们将相对路径变成绝对路径从而在对应的地方创建文件
  这里还要补充两点,
  第一点就是这这个cwd是可以更改的,要想更改,可以使用函数chdir(change working directory),
在这里插入图片描述
  第二点:当一个可执行程序已经跑起来了,现在将这个可执行程序删掉,发现其对应的进程信息还在,并且程序也在继续正常运行
在这里插入图片描述
  这是因为在运行一个程序的时候,本质是将程序从磁盘拷贝到内存,删除掉磁盘中的文件并不会影响它此次的运行(也就是说当一个程序已经跑起来变成进程的时候,已经和磁盘没有关系了,示例exe出现红色字样只是说明该程序在磁盘中对应的可执行程序被删除了),当然了,当我们退出此次运行后,想要再次运行mybin这个可执行程序时就无法找到对应的文件了

通过系统调用创建进程

  要想创建一个进程,就需要认识一个系统调用fork,同样的,我们通过man手册去了解一下这个函数该怎么使用
在这里插入图片描述
  这个函数简单来说就是创建一个子进程,并且值得一提的是,如果创建子进程成功的话,就给父进程返回子进程的id,给子进程返回0,如果创建失败,就返回-1,并且,父子进程的代码共享,数据各自开辟空间
  接下来,我们来通过一个代码样例来创建一个子进程
在这里插入图片描述
在这里插入图片描述
  我们可以看到,打印语句一共被执行了两次,通过打印结果,我们不难看出,第一行打印是由父进程执行的而第二行打印是由子进程执行的,父进程得到fork的返回值就是子进程的id,而由于子进程被成功创建出来了,子进程得到fork的返回值就是0
  通常情况下,我们在fork创建子进程之后会使用if语句进行分流,达到让不同的进程执行不同代码的目的
在这里插入图片描述
在这里插入图片描述

关于创建进程的几点补充

1、为什么fork给父进程返回的是子进程的pid,但是给子进程返回的是0?
  因为一个子进程只有一个父进程,但是一个父进程可能有多个子进程,子进程要想找到父进程的pid只需要调用getppid()方法,但是父进程没有获取子进程的pid的方法,所以将fork函数设计为给父进程返回子进程pid的方法使得父进程可以对自己创建出来的子进程更好地进行管理
2、fork函数为什么会返回两次

pid_t fork()
{
	...
	...
	return id;
}

  一般来说,一个函数执行到需要返回数据的时候,这个函数地大部分的工作已经做完了,什么意思呢?也就是说,在fork函数内部,还没有执行到return语句的时候,子进程已经被创建出来了,有句话叫做”fork之后,代码共享“,实际上在fork函数内部子进程被创建出来之后,代码已经被共享了,然后父进程和子进程分别独立去执行return语句,所以给人一种一个函数返回了两次返回值的感觉。

3、返回值ret是怎么做到即大于0又小于0的?
  首先我们要知道在父进程和子进程之间的大部分数据其实都是共享的,但是当父/子进程试图对某个共享的数据(比如某个变量的值)做一些修改时,这个时候就会发生写时拷贝,以确保父子进程的修改不会相互影响,因此,在写时拷贝机制下,父子进程之间共享大部分数据,并且只有在实际需要修改共享数据时才会进行复制。这种延迟复制的方式既减少了内存占用,又提高了效率,同时保证了数据的一致性。
  话说回来,返回值ret其实也是父子进程共享的数据,但是当父/子进程要修改这个数据的时候,操作系统就会分别为父进程和子进程对该变量进行写时拷贝,所以,看似只有一个ret变量,其实是有多个ret变量分别为父子进程所用

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

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

相关文章

【开源】SpringBoot框架开发服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

借助Aspose.BarCode条码控件,C# 中的文本转 QR 码生成器

二维码用于在较小的空间内存储大量数据。它们易于使用,可以通过智能手机或其他设备扫描来打开网站、观看视频或访问其他编码信息。在这篇博文中,我们将学习如何使用 C# 以编程方式生成基于文本的 QR 码。我们将提供分步指南和代码片段,帮助您…

文件且目录损坏无法读取怎么办?

文件及目录损坏无法读取是计算机使用过程中的常见故障,这可能是由于多种原因导致的,例如硬件故障、文件系统错误、病毒感染或不当操作等。本文将对这一问题进行深入分析,探讨其根本原因,并提供相应的解决方法,包括数据…

行业扩展 | 什么是设备管理系统?你了解多少……

▲ 设备管理是以工厂设备为管理对象,应用科学的理论、方法,通过一系列的技术,经济,组织等措施对各种生产设备和工具的有效管理和维护,以确保生产线的正常运行和提高生产效率的现代化管理。 设备管理组织架构 在企业生产运营中,设备管理工作效率的高低往往取决于其管理架构的好…

堆详解以及简单的堆排序(源代码)

一、什么是堆? 堆是将数组看作一颗完全二叉树 大堆:任意一个父亲大于等于孩子 小堆:任意一个父亲小于等于孩子 有序数组一定是堆 但是堆不一定有序 注意:此“堆”是一个数据结构,用来表示完全二叉树 还有另外一个“…

渗透某巨型企业某个系统的奇葩姿势

本文由掌控安全学院 - urfyyyy 投稿 前言 这个月都在做一个巨型合作企业的渗透测试,这个系统本无方式getshell,得亏我心够细,想的多,姿势够骚。 文中重码,且漏洞已修复。 过程 找到getshell点 目标系统功能很少&…

Python实现时间序列分析霍尔特季节性平滑模型(Holt算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 霍尔特季节性平滑模型是指数平滑技术的一种扩展形式,由E. S. Holt和P. R. Winters分别独立…

nginx-在应用程序中发现不必要的Http响应头

描述:一般是在返回的响应表头中出现了Server键值对 解决方案: 通过headers-more-nginx-module模块将Server去除 https://github.com/openresty/headers-more-nginx-module ./configure --add-module/usr/local/headers-more-nginx-modulemakemake install 编译完成后&#…

Maven高级(一)

文章目录 Maven高级(一)1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承关系2.1.1.1 思路分析2.1.1.2 实现 2.1.2 版本锁定2.1.2.1 场景2.1.2.2 介绍2.1.2.3 实现2.1.2.4 属性配置 2.2 聚合2.2.1 介…

window10 远程桌面

1、设置需要被远程的电脑设置不走 设置电脑名字 开始–>设置–>系统–>关于–>系统设置–>重命名计算机名称 设置远程,这一步很重要。你可以选择指定用户来进行远程桌面。通过“高级–》立即查找”可以找到自己想要设置的用户,此处“名…

ERP定制+跨境电商:双剑合璧,打造全球商业帝国

在当今全球化的商业环境下,跨境电商已成为许多企业拓展市场、实现增长的重要途径。然而,要成功经营跨境电商业务,企业需要面对诸多挑战,如跨国物流、支付结算、客户服务等方面的复杂问题。而ERP定制则能为跨境电商提供强大的支持&…

碳化硅模块使用烧结银双面散热DSC封装的优势与实现方法

碳化硅模块使用烧结银双面散热DSC封装的优势与实现方法 新能源车的大多数最先进 (SOTA) 电动汽车的牵引逆变器体积功率密度范围从基于 SSC-IGBT 的逆变器的 <10 kW/L 到基于 SSC-SiC 的逆变器的约 25 kW/L。100 kW/L 代表了这一关键指标的巨大飞跃。 当然&#xff0c;随着新…

每日汇评:黄金有望在复苏之路上重新夺回关键的2025美元关口

周一&#xff0c;金价在本周初延续了其复苏模式&#xff1b; 随着投资者重新评估美联储降息押注&#xff0c;美元跟随美债收益率走软&#xff1b; 黄金买家需要突破21日移动均线2025美元,RSI指数稳定在50以下&#xff1b; 随着买家将上周的复苏模式延续到周一&#xff0c;黄金价…

5G网络RedCap

RedCap&#xff1a;RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;即“降低能力”。它是3GPP在5G R17阶段&#xff0c;针对速率、时延要求不高的5G应用场景&#xff0c;专门推出的一种新技术标准协议&#xff0c;旨在全面提升5G网络质量和覆盖率&#xff0c;也…

在Python中捕获finally语句中异常消息

当我们在使用Python时&#xff0c;finally语句用于定义无论是否发生异常都必须执行的代码块。正常情况下&#xff0c;finally语句不会捕获异常&#xff0c;而是在异常处理完成后执行。如果这时候finally语句中发生了异常&#xff0c;它会覆盖之前的异常&#xff0c;并成为最终的…

【递归】:原理、应用与案例解析 ,助你深入理解递归核心思想

递归 1.基础简介 递归在计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 例如 递归遍历环形链表 基本情况&#xff08;Base Case&#xff09;&#xff1a;基本情况是递归函数中最简单的情况&#xff0c;它们通常是递…

代码随想录 Leetcode509. 斐波那契数

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月19日&#xff09;&#xff1a; class Solution { public:int fib(int n) {if (n < 2) return n;/*三个数表示加法算式里的 加数 加数 和*//*初始化*/int leftVal 0;int rightVal 1;int sum 0;for (int i 2; i <…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作&#xff0c;是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列&#xff0c;构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

数据结构通讲

目录 集合源码详解 一、常见数据结构讲解 1. 线性数据结构 1.1 数组 1.2 队列 1.3 链表 1.3.1 单向链表 1.3.2 双向链表 1.4 栈 2. 非线性数据结构 2.1 树 2.2 二叉树 2.2.1 概念介绍 2.2.2 遍历操作 2.2.3 删除节点 2.2.4 查找局限性 2.2.5 AVL&#xff08; …

应急响应实战笔记02日志分析篇(4)

第4篇:MSSQL日志分析 常见的数据库攻击包括弱口令、SQL注入、提升权限、窃取备份等。对数据库日志进行分析&#xff0c;可以发现攻击行为&#xff0c;进一步还原攻击场景及追溯攻击源。 0x01 MSSQL日志分析 首先&#xff0c;MSSQL数据库应启用日志记录功能&#xff0c;默认配…