[Linux]进程 / PID

一、认识进程 --- PCB

写一个死循环程序执行起来,观察进程

ps ajx        显示所有进程

用分号可以在命令行的一行中执行多条指令,也可以用 && :

ps ajx | head -1 && ps ajx | grep proc

终止掉进程后再查看:

所以 ./proc 就是死循环程序运行的进程

grep --color=auto proc 之所以一直都在,是因为命令行指令执行时也是一个进程

ps ajx | grep proc 执行时,grep 指令也变成了一个进程,查询结果自然就会包含在内

可以用 grep 的 -v 选项反向搜索来不显示这个进程:

进程可以分为两种:一是执行完就退出的,例如指令,二是用户不关就不退的,被称为常驻进程,例如杀毒软件。

二、进程属性 --- task_struct 内容分类

1. PID

PID 是进程的标示符,用于唯一标识一个进程。

可以用 getpid() 来获取进程的 PID:(需要 sys/types.h 头文件)

2.kill

kill 是一条进程相关的指令,有许多选项:

通过 -9 或 -SIGKILL 可以关闭一个进程:

kill -9 <PID>

3.  /proc

Linux 中一切皆文件,所以进程的属性也以文件的形式可供用户查看

这里以数字命名的每个目录都代表着一个进程,里面的文件都是这个进程相关的属性

其中:

(1)exe

exe 是一个链接文件,标识了这个进程来源于哪个可执行程序

如果我们删掉 proc 文件,就会变成:

注意此时进程之所以还在进行,还有这个进程的目录,是因为我们的删除操作删除掉的是磁盘中的 proc 文件,而进程是内存级的,只要不停止运行就会一直在。

(2)cwd

current work directory “当前工作目录”的缩写

进程刚刚创建时,会用自己的 cwd 属性记录下程序所在的目录作为默认的“当前路径”

如果我们在程序中用 fopen 打开一个新 log.txt 文件,运行后就会在当前路径下创建出一个 log.txt 文件。这个“当前路径”,就来自于进程的 cwd 属性。

而且这个文件被新建时,创建的路径使用的是绝对路径,是用进程的 cwd 和文件名拼接成的:/home/mmr/linux-c/par02/log.txt

想要改变进程的 cwd,可以用 chdir()

就可以把进程的 cwd 更改为根目录,log.txt 也就可以新建在根目录下了(注意普通用户没有根目录的写权限,所以普通用户会创建失败)

(3)/proc是内存级文件

/proc 并不存储在硬盘当中,关机时整个文件被释放掉,不会存储。

4.PPID

在 Linux 系统中,系统启动之后,新创建的任何进程,都是由自己的父进程创建的。

PPID 就是父进程的 PID 。

可以用 getppid() 来获取进程的 ppid

可以看到 ppid 一直是相同的,我们查看一下:

可以看到这个进程是 bash,叫做命令行解释器,是 Linux 系统的shell 外壳

命令行中,执行指令、执行程序,本质都是 bash 的进程,创建的子进程,由子进程来执行代码

用户每一次登录,系统都会为用户创建一个 bash 进程,这里 bash 前有一个 "-",代表当前这个用户是使用命令行终端进行登录的。

三、使用系统调用,创建进程 --- fork

我们运行一下:

可以看到 child proc 打印了两遍。

这是因为 fork 创建出子进程后,原先的进程和子进程都要运行。原先的进程的父进程是 bash,子进程的父进程是原先的进程。

这两个进程先后连续创建的,所以 pid 也是连续的。

由 fork 的返回值可以知道,如果子进程创建成功,那么在原先的进程中,获得的返回值是子进程的 pid,而子进程中获得的 fork 返回值是 0

fork 创建的子进程,与其父进程共享同一份代码,但是数据是各自私有一份的,互不干扰。

父进程的代码,是由硬盘加载进内存后运行的,而子进程的代码,是直接共享自父进程的,而非从硬盘中加载得来。

所以说,进程具有很强的独立性。

多个进程之间,运行时,是互不影响的。

四、创建多个进程

1. C++

Linux 中 C++ 可以使用 .cpp .cc .cxx 作为后缀

使用 g++ -o <程序名> <源文件名> 生成可执行程序

如果使用了C++11中的语法:

2.创建多个进程

为什么这里子进程的 PPID 是 1 ?

因为我截这个图时父进程已经执行完毕挂掉了,此时子进程的 PPID 就不会是原先的父进程,会被 init 进程,托管给 1 号进程。

五、再理解创建子进程

1. fork 函数为什么有两个返回值

在 fork 函数体内部,先是父进程在走,在走的时候,子进程被创建出来,因为父子进程是共享同一份代码的,所以这时候就是父子进程一起在走 fork 函数。

当 fork 函数运行到最后的 return 语句时,父子进程各自执行一次 return,父进程返回父进程的值,子进程返回子进程的值。又因为父子进程的数据是各自私有一份的,所以即使返回值不同也互不干预,不会有任何后果。

因此虽然一个函数有两个返回值,但其实并不冲突。

2. fork之后,父子谁先运行

fork之后,父子进程谁先运行是不确定的,是由OS的调度器自主决定的。

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

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

相关文章

【人工智能99问】门控循环但单元(GRU)的结构和原理是什么?(13/99)

文章目录GRU&#xff08;Gated Recurrent Unit&#xff09;的结构与原理一、GRU的结构与原理1. 核心组件2. 计算原理&#xff08;数学公式&#xff09;二、GRU的使用场景三、GRU的优缺点优点&#xff1a;缺点&#xff1a;四、GRU的训练技巧五、GRU的关键改进六、GRU的相关知识与…

去中心化协作智能生态系统

摘要&#xff1a; 本报告深入HarmonyNet系统的工程实现细节&#xff0c;从开发者视角出发&#xff0c;提供了模块化的组件规范、基于API的数据交互协议、可直接执行的业务逻辑流程以及经过优化的、可渲染的系统图表。报告的核心在于将V2.0的高层架构转化为具体的模块接口&#…

FPGA自学——整体设计思路

FPGA自学——整体设计思路 1.设计定义 写一套硬件描述语言&#xff0c;能够在指定的硬件平台上实现响应的功能 根据想要实现的功能进行设定&#xff08;如&#xff1a;让LED一秒闪烁一次&#xff09; 2.设计输入 方法&#xff1a; 编写逻辑&#xff1a;使用verilog代码描述逻辑…

ubuntu下好用的录屏软件

​ 以下是 vokoscreen 的安装教程,适用于 Linux 系统。vokoscreen 是一款简单易用的屏幕录制工具,支持录制屏幕、摄像头和音频。 安装 vokoscreen vokoscreen 提供了多种安装方式,包括通过包管理器、Deb 包或 AppImage 文件。 方法 1:通过 apt 安装(Ubuntu/Debian) su…

web安全漏洞的原理、危害、利用方式及修复方法

1. 原理 Web安全漏洞通常是由于Web应用程序在设计、编码或配置过程中存在缺陷导致的。这些缺陷可能使攻击者能够获取敏感数据、破坏应用程序或利用其进行其他恶意活动。2. 常见危害数据泄露&#xff1a;攻击者可能窃取用户的个人信息、密码、信用卡信息等敏感数据。会话劫持&am…

Linux—Linux中的权限管理

Linux中的权限管理前言目录一、shell命令以及运行原理二、Linux中的权限概念1、如何实现用户账号的切换2、如何仅提升当前指令的权限3、如何将普通用户添加到信任列表三、Linux中的权限管理1、文件访问者的分类&#xff08;人&#xff09;2、文件类型和访问权限&#xff08;事物…

解决在nuxt2框架中引入swiper报错:window is not defined

前言&#xff1a;最近帮助公司更新官网&#xff0c;我们公司为了加快首页加载速度采用了Nuxt框架&#xff0c;但是官网首页需要一个轮播图&#xff0c;但是安装之后&#xff0c;运行项目就开始报错&#xff1a;window is not defined&#xff0c;后来查阅了资找到了报错的原因以…

牛客NC14661 简单的数据结构(deque双端队列)

题目描述 栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题。 这个数据结构形如一个“长条形”的容器&#xff0c;一开始该容器是空的&#xff0c;有以下七种操作&#xff1a; 111 aaa&#xff1a;从前面插入一个元素 aaa 222&#xff1a;从前面删除一个元素 333 a…

【AI大模型:架构实战】32、DeepSpeed大模型训练全解析:从技术原理到千亿参数实战优化指南

DeepSpeed作为微软开源的分布式训练框架,已成为大模型工业化训练的核心工具。它通过系统级创新突破了单卡显存限制,将千亿参数模型的训练成本降低75%以上,同时提升训练速度3-8倍。 本文整合2025年最新实践,从核心技术原理(如ZeRO优化、3D并行)到千亿参数模型实战流程,全…

GraphQL与REST在微服务接口设计中的对比分析与实践

问题背景介绍 在微服务架构中&#xff0c;服务之间的接口设计成为系统灵活性、可维护性和性能的关键。传统的REST API因其简单、成熟的生态而得到广泛应用&#xff0c;但在复杂业务场景下会面临接口粒度、版本兼容、数据冗余等挑战。GraphQL作为Facebook开源的查询语言&#xf…

Git分支管理与Stash技巧:从基础到高级工作流详解

引言Git作为现代软件开发的核心工具&#xff0c;其分支管理能力是支撑团队协作开发的基石。本文将系统讲解Git分支的创建、合并、冲突解决等基础操作&#xff0c;深入剖析分支底层原理&#xff0c;并介绍stash暂存技巧和业界主流的分支管理策略&#xff0c;帮助开发者构建高效的…

windows wsl ubuntu 如何安装 maven

命令 sudo apt update sudo apt install maven验证安装是否成功&#xff1a; $ mvn -versionApache Maven 3.6.3 Maven home: /usr/share/maven Java version: 1.8.0_402, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre Default locale: en, platf…

Swift6.1 - 可选类型处理

目录1、nil2、可选绑定3、提供后备值4、强制解包5、隐式解包可选在可能缺失值的情况下&#xff0c;请使用 可选。可选代表两种可能性&#xff1a;要么 存在一个指定类型的值&#xff0c;并可以解包可选以访问该值&#xff1b;要么 根本就没有值。举一个可能缺失值的例子&#x…

【数据结构】关于链表的面试题

一、单链表逆置1、法一思路&#xff1a;通过两个辅助指针 p和 q&#xff0c;在遍历链表时逐个反转指针方向。p初始化为 第一个有效节点&#xff0c;用于遍历原链表&#xff1b;q初始化为 NULL&#xff0c;用于临时保存 p 的下一个节点。plist->next 被置为 NULL&#xff0c;…

LVS(Linux virual server)

LVS&#xff08;Linux virual server&#xff09; 系统性能扩展方式 Scale UP&#xff1a;增强单台服务器性能&#xff0c;适合单体应用&#xff0c;但有硬件限制。 Scale Out&#xff1a;增加服务器数量&#xff0c;适合分布式和集群系统&#xff0c;可灵活扩展。 集群&#x…

在 ASP.NET Core 和 JavaScript 中配置 WebSocket

在本文中&#xff0c;我们将了解 WebSocket&#xff0c;并逐步讲解如何在客户端配置 WebSocket 并与服务器通信。首先&#xff0c;让我们先来了解一下“ WebSocket ”。什么是 WebSocketWebSocket 是一种协议&#xff0c;它提供了一种通过持久连接在客户端和服务器之间交换数据…

车载刷写框架 --- 关于私有节点刷写失败未报引起的反思

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

ABP VNext + GitHub Actions:CI/CD 全流程自动化

&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自动化 &#x1f4da; 目录&#x1f31f; ABP VNext GitHub Actions&#xff1a;CI/CD 全流程自动化&#x1f929; TL;DR&#x1f504; 全局流程概览1️⃣ 准备工作与项目结构1.1 &#x1f6e0;️ 工具链与 S…

Elasticsearch 重命名索引

作者&#xff1a;来自 Elastic Alex Salgado 学习如何使用四种实用方法在 Elasticsearch 中重命名索引。 想获得 Elastic 认证&#xff1f;看看下一期 Elasticsearch Engineer 培训什么时候开始&#xff01; Elasticsearch 拥有丰富的新功能&#xff0c;帮助你根据使用场景构建…

高通8255 Android Virtio Virtio-SPI 配置方法

目录 一&#xff1a;VirtIO和Passthrough的区别 二&#xff1a;配置逻辑 三&#xff1a;配置方法 步骤一&#xff1a;QNX SPI资源配置 & 测试 配置 测试 步骤二&#xff1a;BE配置 &测试 配置 测试 步骤三&#xff1a;Hypervisor配置 配置 测试 步骤四&…