Linux---进程(2)

news2024/11/19 20:17:49

目录

查看进程

查看进程pid

系统目录查看

理解当前工作目录用途

fork创建进程

存在问题

问题解决

问题一

问题二


本文介绍进程标识符的相关知识以及创建子进程。

查看进程

指令就是可执行程序,每次运行时,都需要被加载到内存,运行起来都要变成进程。

指令执行的一瞬间,进程被创建,执行结束之后,进程被销毁。

进程是有生命的。

ps axj #查看当前所有进程(以列表的形式打印出来)

在Linux中,普通进程都有它的父进程。

当前进程是由它的父进程创建出来的。

pid是当前进程的唯一标识符。ppid是当前进程的父进程的唯一标识符。

pid是进程的唯一标识符,属于操作系统内部PCB的标识符数据,用户不可直接访问,只能通过系统调用接口进行访问。这种做法称为系统调用。

查看进程pid

 需要安装man手册

yum install man #安装man手册,非root用户前面加sudo

验证一下上述理论。

ps axj | head -1 && ps axj | grep 进程pid #过滤打印出进程信息名和指定进程信息

每一次启动一个进程,进程的pid会变化,但父进程不变。

在命令行中启动的进程,都是bash创建的子进程,bash是所有进程的父进程。

系统目录查看

Linux会把进程相关的内存级别的数据会以文件系统的形式显示在/proc目录下,就是将内存中的数据放在/proc目录中。以数字命名的目录就是当前内存中的进程的目录,目录名就是当前内存中进程的pid。

也就是说,如果我创建一个进程,那么在/proc这个目录下,就会产生一个记录这个进程信息的目录,目录名是这个进程的pid。

我们来了解一下。

理解当前工作目录用途

这里的cwd是当前的工作目录,exe是可执行程序所处的目录。

exe很好理解,进程要执行这个可执行程序就是通过exe来访问的。

如果我们的可执行程序中有类似于fopen("filename","r/w")这样的函数,这种函数会检测当前工作空间是否存在filename文件,如果不存在则会创建。那么,进程如何确定当前工作目录在哪呢?就是通过cwd来确定访问的。

那么我如果把这个可执行程序删掉,会怎么样呢?

删掉之后,对应的exe就会出现闪烁,但是可执行程序还是可以继续执行的。

原因在于,可执行程序在磁盘上,可执行程序在预加载阶段就已经拷贝在内存中了,所以,可执行程序删除之后,这个进程还是依旧可以运行。

如果我们将这个cwd更改了之后,又会怎样呢?

更改工作目录空间的函数为chdir(const char* path)

测试一下

fork创建进程

我们现在知道,将指令运行起来,这个指令就会变成进程。但是,我们现在无法手动创建进程,即我们还不会用代码的方式创建进程。

fork函数即可以帮助我们创建进程。

我们发现,调用fork函数之后的代码被原进程和新进程都执行了一次,且原进程是新进程的父进程。并且fork之后的代码是共享的

那么,这个fork函数为什么要有返回值呢?getpid/getppid函数有返回值是因为进程是一个整数,fork函数创建子进程,还需要有返回值吗?--- 结合说明文档和代码看一下

一般而言,我们可以在进程中创建子进程,让父子进程各自做不同的工作。

存在问题

这里就会存在两个问题

问题一:既然子进程是被父进程创建出来的,进程都有对应的可执行程序且具有唯一性,那么此时,父子进程只有一份可执行程序,这是怎么回事呢?

问题二:为什么父子进程可以拿到不同的返回值呢?这里只调用了一次呀。

问题解决

问题一

我们用if-else来让俩个程序执行不同的指令,然后终止掉任意一个进程,研究一下另一个进程是否还可以被正常执行。

kill -9 进程pid #终止指定进程
while :; do ps axj | head -1 && ps axj | grep 可执行程序 | grep -v grep; sleep 1; done #监控指定可执行程序的进程信息

由此可见,进程之间是具有独立性的,互相不影响。这是操作系统设计的时候必须要保证的

那么,为什么呢?

 一般而言,如果父子进程对数据没有修改的话,fork之后父子进程是代码共享的;如果父子进程对数据有修改的话,那么原来的代码和数据就会被操作系统维护起来,父子进程要修改的变量被操作系统单独的给父子进程拷贝一份,父子进程需要修改的话,就去拷贝的地方去修改。这种做法也被称为写时拷贝

问题二

这里只调用了一次fork,为什么父子进程可以拿到不同的返回值呢?

根据上图,我们就了解到在执行return语句之前,子进程就被创建出来了,所以就返回了两次

。给父子进程返回不同的值,是为了让我们区分父子进程,让他们分别执行不同的逻辑。

至此,进程的标识符内容大致就先了解到这里。

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

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

相关文章

动物之森-小红书2024笔试(codefun2000)

题目链接 动物之森-小红书2024笔试(codefun2000) 题目内容 塔子哥最近在玩一款叫做“动物之森”的四字开放游戏世界。由于塔子哥氪金了,所以他在游戏中拥有很多个宝箱,每个宝箱里都装着一些他收集的宝石。每一种类型的宝石都有不同的作用。 有一天&…

java--jvm虚拟机(都是要点)

请带着以下问题,学习并理解jvm 问题一: 为什么fullGC会对系统性能有影响?youngGC却几乎没有? 问题二: outofmemory是什么异常?什么时候会出现?如何处理? 问题三: 线程…

鸿蒙 HarmonyOS NEXT端云一体化开发-云函数篇

前言 TODO:新建项目和应用,开通云函数服务(AGC)端侧开发:Arkts界面开发云测开发:云函数、认证服务、云存储、云数据库 一、登录 地址:https://id1.cloud.huawei.com/CAS/portal/loginAuth.htm…

Nginx周末部署

背景 Nginx是本人学习的一类中间件,上次完成了vue的搭建,所以顺便把项目加入Nginx吧 1. 镜像拉取与测试 查询dockerHub,选择最新最稳定的版本 docker pull nginx:stable-perl 执行下载 docker run -d --name mynginx -p 8080:80 -v D:\IM…

【Kubernetes】配置管理(一):ConfigMap

配置管理(一):ConfigMap 1.配置管理2.使用 ConfigMap 管理 Pod 的配置信息2.1 创建 ConfigMap2.1.1 在命令行中通过指定 ConfigMap 的参数进行创建2.1.2 通过指定的配置文件创建 ConfigMap2.1.3 通过一个文件内的多个键值对创建 ConfigMap2.1…

C++数据结构重要知识点(3)(红黑树及其插入操作)

1.红黑树和AVL树的区别 红黑树和AVL树都是平衡树,都是为了解决二叉搜索树的劣势。其中,AVL树的左右子树的高度差不超过1,而红黑树的最长路径不超过最短路径的二倍,也就是说,红黑树是一种近似平衡,而AVL树是…

【设计模式】(万字总结)深入理解Java中的创建型设计模式

1. 前言 在软件开发的世界里,设计模式是一种被广泛接受并应用的解决方案。它们不仅仅是代码的设计,更是对问题的思考和解决的方法论。在Java开发中,特别是在面向对象的编程中,设计模式尤为重要。创建型设计模式,作为设…

JavaScript安全编程宝典【万字详解】

文章目录 简介基本说明特点两种使用方式在script中写使用script标签引入JS文件 数据类型介绍特殊值 运算符算数运算符赋值运算符逻辑运算符:条件运算符 数组的定义基本使用数组的遍历 函数含义函数定义方式基本语法代码示例 细节和注意事项 自定义对象Object形式{} …

解决mysql数据库表读取中文乱码问题

本文目录 0、省流1、问题出现2、问题排查3、结论 0、省流 在服务器上创建数据库服务时,使用的sql脚本加载的数据库表,其中脚本中有一些预设的测试数据包含中文汉字,由于linxu服务器控制台默认编码是lantin1,导致中文通过该编码方…

鸿蒙HarmonyOS开发:多种内置弹窗及自定义弹窗的详细使用指南

文章目录 一、消息提示框(showToast)1、导入模块2、语法3、参数4、示例5、效果 二、对话框(showDialog)1、导入模块2、语法3、参数4、示例5、效果 三、警告弹窗(AlertDialog)1、语法2、参数3、AlertDialogP…

JDBC(Java访问数据库)

Java Database Connectivity:Java访问数据库的解决方案 JDBC定义了一套标准接口,即访问数据库的通用API, 不同的数据库厂商根据各自数据库的特点去实现这些接口。 JDBC希望用相同的方式访问不同的数据库,让具体的数据库操作与数…

科普文:科普文:springcloud之-Hystrix服务容错

Hystrix概念 Hystrix 服务容错保护 的概念和说明 这就是大名鼎鼎的:豪猪 豪猪的英文就是:Hystrix,国外一些大牛的程序员在给自己的架构起名字的时候,往往就这么特别。哪天咱们中国人自己也能写出些架构,咱们就按照中…

⚒linux通过shell脚本上传文件至minio中

🔴大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 前言 之前数据库是备份到了七牛云上了,但是眼看着数据库文件越来越大,七牛云里面的余额越来越少,所以,转移阵地。 家里的nas&…

昇思25天学习打卡营第20天|munger85

GAN图像生成 生成对抗网络中是为了让我们生成的东西向期望的那样,就是为了让生成的东西很像,真的,例如用它来画画。就是描述整个网络的逻辑和目的,它有两部分组成,一个是生成器,一个是辨别器。他希望的是辨…

C++程序编程中的 SetWindowLong 函数的几个常见用途(附源码)

目录 1、API函数SetWindowLong说明 2、修改窗口风格 3、给窗口指定新的窗口消息处理函数,以拦截窗口消息 4、可以给窗口设置关联的UserData数据,方便在窗口内部使用这些数据 5、64位程序中需要使用SetWindowLongPtr 6、最后 C++软件异常排查从入门到精通系列教程(专栏…

Sping项目只能勾选17和21 (已解决) 导致的后续Invalid bound statement (not found):

问题发现 今天创建项目的时候发现 idea初始化spring的时候选择不了Java8 解决方案:替换URL为 https://start.aliyun.com/ 将IDEA页面创建Spring项目,其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。 将https://start.spr…

TortoiseSVN安装使用教程(超详细)

目录 前言1. 下载2. 安装2.1 安装TortoiseSVN(看图操作)2.2 安装语言包(看图操作) 3. 使用3.1 版本库浏览器3.2 其他教程 前言 TortoiseSVN:(俗称小乌龟)Subversion版本控制系统的一个免费开源客…

Pytorch基础:Tensor的view方法(非连续张量也可以使用view)

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,view是Tensor的一个重要方法,用于返回一个改变了形状,但数据和数据的顺序与原来一致的新张量,但是新张…

夸克Android一面凉经(2024)

夸克Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《夸克Android一面凉经(2024)》。 面试职位: 智能信息-客户端开发工程师-夸克小说 技术一…

20240728 每日AI必读资讯

Google Gemini 聊天机器人更新 可以免费使用Gemini 1.5 Flash 1. 引入Gemini 1.5 Flash模型: • 提供更快和更高质量的响应。 • 提升推理和图像理解能力。 • 上下文窗口扩大到 32Ktokens,允许进行更长的对话和处理更复杂的问题。 • 即将支持通过 Goo…