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

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

相关文章

【性能测试入门必看】性能测试理论知识

一、性能测试理论知识 1、常用的七种性能测试方法 (1) 后端性能测试:其实,你平时听到的性能测试,大多数情况下指的是后端性能测试,也就是服务器端性能测试。后端性能测试,是通过性能测试工具模拟大量的并发用户请求&…

Unity数据持久化之PlayerPrefs

PlayerPrefs概述 什么是数据持久化 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。即将游戏数据存储到硬盘,硬盘中数据读取到游戏中,也就是传统意义上的存盘。 基本方法 PlayerPrefs是什么…

P4447 [AHOI2018初中组] 分组题解

题目 小可可的学校信息组总共有n个队员,每个人都有一个实力值。现在,一年一度的编程大赛就要到了,小可可的学校获得了若干个参赛名额,教练决定把学校信息组的n个队员分成若干个小组去参加这场比赛。 但是每个队员都不会愿意与实…

CleanMyMac X2024破解电脑版安装包下载

CleanMyMac X 4.14.6 是 CleanMyMac X 的一个具体版本号。这个版本可能包含了一些新的功能、改进和修复,以提高软件的性能和稳定性。以下是一些关于 CleanMyMac X 4.14.6 的特点和更新内容: 恶意软件保护:CleanMyMac X 4.14.6 继续加强其恶意…

机构如何搭建一个在线课程教学平台?

随着数字化教育的兴起,越来越多的教育机构开始考虑建立自己的在线课程教学平台。这一趋势不仅顺应了时代的发展,而且为教育行业带来了诸多便利和优势。构建一个在线教学平台可以帮助机构拓宽服务范围、提升教学质量、增强学生体验,并且能够有…

【Linux】---Linux下基本指令(2)

目录 一、指令详细介绍1.1 cat 指令1.2 echo 指令1.3 more 指令1.4 less 指令1.5 head 指令1.6 tail 指令1.7 date 指令1.8 cal 指令1.9 find 指令1.10 grep 指令1.11 zip/unzip 指令1.12 tar 指令1.13 uname –r 指令: 一、指令详细介绍 1.1 cat 指令 语法&#…

Sora 和之前 Runway 在架构上的区别

问:Sora 和之前 Runway 那些在架构上有啥区别呢? 答:简单来说 Runway 是基于扩散模型(Diffusion Model)的,而 Sora 是基于 Diffusion Transformer。 Runway、Stable Diffusion 是基于扩散模型&#xff08…

阿里云服务器“镜像”全方面解析

阿里云服务器镜像怎么选择?云服务器操作系统镜像分为Linux和Windows两大类,Linux可以选择Alibaba Cloud Linux,Windows可以选择Windows Server 2022数据中心版64位中文版,阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器操…

Codeforces Round 924 (Div. 2)题解(A-D)

A - Rectangle Cutting 链接&#xff1a;A - Rectangle Cutting 思路 考虑横边和纵边&#xff0c;若为偶数&#xff0c;则从中间分开&#xff0c;重新组合为一个长方形&#xff0c;检测是否与原来的长方形一致。 代码 #include <bits/stdc.h> using namespace std;i…

【退役之重学前端】JavaScript 类、构造器、原型的关系

ES6中类的概念&#xff0c;我之前花了较长的时间学习Java&#xff0c;所以对类感觉很亲切。我并不满足仅仅会使用&#xff0c;让我们一起深究一下 JavaScript 中的类吧。 构造一个类&#xff0c;并实例化一个对象 class Animal{constructor(name){this.name name;}getName(){…

京东电商API接口|Python爬虫实战 | 批量爬取网页信息

爬虫爬取网页有时需要模拟网页行为&#xff0c;比如京东、淘宝详情页面&#xff0c;图片加载随着滚动自动加载的。这种情况我们就要进行浏览器模拟操作才能获取要爬取的数据。 Selenium 是一个用于自动化浏览器操作的开源框架&#xff0c;主要用于网页测试&#xff0c;支持多种…

短链接系统测试报告

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