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

进程的初步认识

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

前言

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

查看进程

  查看进程的信息可以在/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.mzph.cn/news/689042.shtml

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

相关文章

代码随想录刷题笔记-Day19

1. 二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝…

ZigBee学习——基于AF的数据通信

文章目录 一、简单描述符1.1 简单介绍1.2 简单描述结构体介绍1.3 结构体中的簇1.4 应用场景 二、AF通信原理2.1 通信过程2.2 端点号分类2.3 通信方式2.4 注册简单描述符 三、数据发送API简介3.1 AF层数据发送API3.2 基于AF层封装的通信API3.2.1 点对点通信API3.2.2 广播通信API…

数据库管理-第151期 Oracle Vector DB AI-03(20240218)

数据库管理151期 2024-02-18 数据库管理-第151期 Oracle Vector DB & AI-03(20240218)1 向量数据库应用场景2 Oracle Vector DB3 Vector数据类型4 Vector运算5 Vector DML插入向量获取向量 总结 数据库管理-第151期 Oracle Vector DB & AI-03&am…

LeetCode 热题 100 Day01

哈希模块 哈希结构: 哈希结构,即hash table,哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素,有两种方法: 1.从头遍历,复杂度&#xf…

【Spring】三级缓存

目录标题 触发所有未加载的实例a - 开始getBean( doGetBean) - 获取单例beangetSingleton() - 获取单例beancreateBean(doCreateBean) - 创建beancreateBeanInstance - 创建并返回beanaddSingletonFactory -放三级缓存populateBea…

序列发生器

一开始想直接FSM,划分出6状态依次输出对应的。但其实只要6比特的移位寄存器,每次输出高位。复位后的默认值时6’b001_011。这样就可以实现循环,这种移位寄存器也叫barrel_shifter。循环移位。也可以使用循环计数器,然后case计数器…

<爬虫Error篇>:乱码问题

前言: 当涉及到网页编码问题时,经常会遇到不同页面使用不同编码方式的情况。这可能导致在解析页面时出现乱码,使我们无法正确获取页面内容 正文: 网页的编码问题: 在处理网页编码问题之前,我们需要了解一些基础知识。网页中的编码方式通常…

JRT监听-PDF-Excel-Img

依赖全新设计,我们无需再顾虑历史兼容性的束缚;同时,基于多年来累积的深入需求理解,JRT监听机制巧妙地借助CMD命令模式,达成了监听的全面统一。无论是PDF、Excel还是图片文件,都不再需要特殊对待或额外区分…

MT8781核心板_MTK8781安卓核心板规格参数

MT8781安卓核心板以其强大的性能和高效的能耐备受瞩目。其八核CPU架构包括(2x Cortex-A76 2.2GHz 6x Cortex-A55 2.0GHz),以及高性能的Arm Mali G57级GPU。同时,配备高达2,133MHz的LPDDR4X内存和快速的UFS 2.2级存储,大大加速了数据访问速…

java面试集合篇

上面是java中集合的整体框架图。 集合使用的数据结构 算法复杂度分析 时间复杂度分析 时间复杂度分析&#xff1a;来评估代码的执行耗时的 /*** 求1~n的累加和* param n* return*/ public int sum(int n) {int sum 0;for ( int i 1; i < n; i) {sum sum i;}return …

ubuntu22.04-磁盘管理-虚拟机动态扩容-系统monitor

文章目录 1.虚拟机2.ubuntu设置3.命令查看4.系统资源管理器 1.虚拟机 关闭ubuntu22.04&#xff0c;然后修改虚拟机设置&#xff0c;如下图所示&#xff1a; 修改容量 2.ubuntu设置 搜索打开disks&#xff0c;如下图所示&#xff1a; 选择目标磁盘&#xff0c;选择调整大小…

Filterajax

1.Filter概念 概念:表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一;过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能.过滤器可以完成一些通用操作比如:登录添加购物车,视频广告,敏感字符处理等等... 2.Filter快速入门 3.Listener 4.Ajax学习 1.使用场…

Android 15 第一个开发者预览版

点击查看&#xff1a;first-developer-preview-android15 点击查看&#xff1a;Get Android 15 2024年2月16日,谷歌发布 Android 15 第一个开发者预览版 翻译 由工程副总裁戴夫伯克发布 今天&#xff0c;我们发布了Android 15的首个开发者预览版&#xff0c;这样我们的开发者就…

腾讯云OSS文件上传功能

腾讯云COS介绍 腾讯云COS&#xff08;Cloud Object Storage&#xff09;是一种基于对象的存储服务&#xff0c;用于存储和管理海量的非结构化数据&#xff0c;如图片、音视频文件、备份数据等。它具有以下特点和优势&#xff1a; 高可靠性&#xff1a;采用分布式存储架构&…

MySQL学习记录——십이 事务

文章目录 1、了解事务2、事务提交3、事务隔离级别1、隔离性和隔离级别2、查看、设置隔离级别3、读未提交4、读提交5、可重复读6、串行化7、总结 4、事务一致性5、事务隔离性1、隐藏字段2、undo日志3、模拟MVCC4、Read View 6、读提交RC、可重复读RR的区别 1、了解事务 MySQL内…

强化学习(TD3)

TD3——Twin Delayed Deep Deterministic policy gradient 双延迟深度确定性策略梯度 TD3是DDPG的一个优化版本&#xff0c;旨在解决DDPG算法的高估问题 优化点&#xff1a; ①双重收集&#xff1a;采取两套critic收集&#xff0c;计算两者中较小的值&#xff0c;从而克制收…

第一个 Angular 项目 - 动态页面

第一个 Angular 项目 - 动态页面 使用的所有技巧都在下面的笔记里&#xff1a; [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面&#xff0c;即不涉及到跨组件交流的内容 以下涉及到组件内的沟通&#xff0c;从这开始数据就“活”…

才气系统与逻辑系统道装实现的比较

才气系统与逻辑系统道装实现的比较 道装道装思想简介烛火流形学习引擎&#xff0c;流形学习的引入王船山信息熵&#xff0c;简称王船山熵&#xff1b;凝聚态数学可计算函数科学方法道装由来琴语言简介逻辑与才气的逐层比较表格&#xff08;王船山熵&#xff09; 道装 道装思想…

OpenCV 入门讲解

OpenCV 入门讲解 OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 是一个开源的计算机视觉库&#xff0c;它提供了许多高效实现计算机视觉算法的函数&#xff0c;从基本的滤波到高级的物体检测都有涵盖。OpenCV 使用 C/C 开发&#xff0c;同时也提供了 Pyt…

短链接系统测试报告

目录 项目背景 项目功能 自动化测试 总结 项目背景 随着互联网的发展&#xff0c;链接&#xff08;URL&#xff09;变得越来越长且复杂&#xff0c;这不仅影响用户体验&#xff0c;还可能由于字符限制导致在某些平台或应用中无法完整显示。为了解决这一问题&#xff0c;我…