【Linux系统编程】进程的认识

news2024/12/22 19:18:37

介绍:

        进程是程序执行的实体,可将其理解为程序。比如:当我们使用文本编辑器Notepad应用程序来编写一篇文章时,此时,Notepad应用程序就被加载到了内存中,并且它占用的资源(如内存、CPU等)也得到了分配。在这个过程中,Notepad应用程序就是一个进程,此进程在使用过程将不断被执行,当关闭Notepad应用程序,此进程占用的资源将释放,进程结束。而操作系统则是负责调度和管理这个进程的实体,它为进程分配资源,并在进程结束后回收资源。也就是说,操作系统负责管理进程。


进程控制块

        进程控制块的简称为PCB,是操作系统中用于管理进程的数据结构。它包含了进程的所有状态信息,可以理解为进程属性的集合,用来描述一个进程的所有属性,是进程存在的唯一标志。 

        Linux下的PCB(进程控制块)是 task_struct 结构体,此结构体是Linux内核的一种数据结构。

        使用ps axj指令可查看进程详细信息。其中,PID对应的就是进程的标识符,PPID对应的是父进程的标识符。标识符是用来描述本进程的唯一标示符,用来区别其他进程。


标识符函数

        在写程序时,要想观察此进程的PID可在代码中使用 getpid() 函数,此函数可获得进程的PID,返回类型为pid_t(就是int),即谁调用getpid,就获取谁的PID。对应的还有 getppid() 函数,获取该进程的父进程标识符,返回类型为pid_t(就是int)

        这里要说明一下,每一次启动程序时,对应的PID都会发生变化,PPID一般不会发生变化,除非您通过某种方式改变了父进程。

        在Linux中,当您启动一个程序时,该程序的PPID通常是被启动该程序的shell进程的PID,即该进程的PPID对应的就是bash或其他shell进程。可以说每启动的一个进程都是bash或shell的子进程。因此说每一次启动进程时,PID都会变化,PPID一般不会变化,除非我们将父进程也改变。

[zhu@zhujunhao day21]$ ll
total 16
-rw-rw-r-- 1 zhu zhu  305 Dec 21 17:07 code.cpp
-rwxrwxr-x 1 zhu zhu 9176 Dec 21 17:07 code.exe
[zhu@zhujunhao day21]$ cat code.cpp    //程序的源代码
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{
    pid_t pid = getpid();
    pid_t ppid = getppid();
    sleep(3);
    cout << "该进程对应的PID: " << pid << endl;
    sleep(3);
    cout << "该进程对应的PPID: " << ppid << endl;
    return 0;
}
[zhu@zhujunhao day21]$ ./code.exe
该进程对应的PID: 2248
该进程对应的PPID: 1381

 

/*下面我们删除程序的进程,再次编译运行后可发现,该进程的PID发生了变化,PPID没有改变。该程序的PPID就是bash或shell进程*/

[zhu@zhujunhao day21]$ rm -f code.exe  
[zhu@zhujunhao day21]$ ll
total 4
-rw-rw-r-- 1 zhu zhu 305 Dec 21 17:07 code.cpp
[zhu@zhujunhao day21]$ g++ -o code.exe code.cpp  
[zhu@zhujunhao day21]$ ./code.exe   
该进程对应的PID: 2257
该进程对应的PPID: 1381


/proc目录

        下面,我们了解一下 /proc目录。/proc目录提供了一种访问系统内核内部数据结构、改变内核设置的机制。用户和应用程序可以通过访问/proc目录中的文件和子目录,来获取系统的信息,并可以改变内核的某些参数。

        其中,/proc/[pid]目录提供了访问和操作进程信息的接口,此接口提供指定进程的各种详细信息,可方便地了解和控制进程的状态和行为。

        这里要说明一下,当使用指令 ll /proc/[pid] 进行详细查看时,对应的cwd是当前进程启动的工作目录,即进程启动时所在的工作目录。exe对应的是可执行程序的工作目录,即进程运行的程序。当修改当前进程或可执行文件的工作目录时,对应的cwd或exe会发生变化。

[zhu@zhujunhao day21]$ ll /proc/1381

........
lrwxrwxrwx 1 zhu zhu 0 Dec 21 16:54 cwd -> /home/zhu/day21   //进程启动的工作目录
........

lrwxrwxrwx 1 zhu zhu 0 Dec 21 16:54 exe -> /usr/bin/bash   //可执行程序的工作目录


创建进程fork初识

        fork函数(没有参数):创建子进程,在fork之后,代码会形成分支形成两个,即代码共享,其中一个是该函数创建的一个子进程。其中,该函数返回值为pid_t,给创建的子进程返回0,父进程返回子进程的PID。

[zhujunhao@bogon code]$ cat test.cpp     //源代码
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{
    cout << "PID: " << getpid() << endl;
    int ret = fork();
    cout << "ret = fork(): " << ret << endl;
    sleep(1);
    return 0;
}
[zhujunhao@bogon code]$ ./test.exe     //执行源代码的可执行程序
PID: 9655
ret = fork(): 9656  
ret = fork(): 0

        此函数通常跟 if 条件连用,分别使父子进程执行不同的功能。

[zhujunhao@bogon code]$ cat test.cpp      //源代码
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main()
{
    cout << "PID: " << getpid() << endl;
    int ret = fork();
    if (ret == 0)
    {
        cout << "I am Child: PID " << getpid() << "  PPID: " << getppid() << endl;
    }
    else 
    {
        cout << "I am father: PID " << getpid() << "  PPID: " << getppid() << endl;
    }
    sleep(1);
    return 0;
}
[zhujunhao@bogon code]$ ./test.exe   //可执行程序
PID: 10418
I am father: PID 10418  PPID: 3038
I am Child: PID 10419  PPID: 10418

        在执行进程的过程中,若不想执行该进程,通常使用 kill -9 [pid]命令强制终止指定进程的执行。关闭该进程后,不会影响该进程的子进程或父进程,即进程(任意进程,包括父子进程)之间是有独立性的,互相是不能影响,可放心使用。

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

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

相关文章

伦敦金交易内地与香港有何区别

伦敦金交易是国际银行间市场层面的现货黄黄金交易&#xff0c;亚洲市场的交易中心在中国香港&#xff0c;现在不管是香港本地还是内地的投资者&#xff0c;都可以在网上开户&#xff0c;通过香港的平台参与伦敦金交易&#xff0c;所得到的服务是同等的、公平的、与国际市场接轨…

在Windows上使用 Python

本文档旨在概述在 Microsoft Windows 上使用 Python 时应了解的特定于 Windows 的行为。 与大多数UNIX系统和服务不同&#xff0c;Windows系统没有预安装Python。多年来CPython 团队已经编译了每一个 发行版 的Windows安装程序&#xff08;MSI 包&#xff09;&#xff0c;已便…

Linux 音视频SDK开发实践

一、兼容性适配处理 为什么需要兼容处理&#xff1f; 1、c兼容处理 主要有ABI兼容性问题&#xff0c;不同ubuntu系统依赖的ABI版本如下&#xff1a; ubuntu 18.04ubuntu 16.04ubuntu 14.04g7.55.44.8stdc版本libstdc.so.6.0.25libstdc.so.6.0.21libstdc.so.6.0.19GLIBCXXG…

【SpringBoot快速入门】(4)SpringBoot项目案例代码示例

目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven&#xff0c;详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例&#xff0c;上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动&#xff0c;从这一节开…

JavaCV音视频开发宝典:UDP局域网组播推流,多播推流,局域网多网段推流,使用UDP方式推送TS组播流,实现UDP一对多组播

《JavaCV音视频开发宝典》专栏目录导航 《JavaCV音视频开发宝典》专栏介绍和目录 ​ 前言 在之前文章中我们已经实现rtp点到点传输JavaCV音视频开发宝典:rtp点到点音视频传输(一对一音视频直播)和rtp广播JavaCV音视频开发宝典:rtp广播方式发送TS流音视频传输(一对多音视…

私域用户标签体系|超全指南

将用户进行精准画像&#xff0c;搭建用户标签体系&#xff0c;将自己的客户分层&#xff0c;逐个突破。

IEEE TASLP | 联合语音识别与口音识别的解耦交互多任务学习网络

尽管联合语音识别&#xff08;ASR&#xff09;和口音识别&#xff08;AR&#xff09;训练已被证明对处理多口音场景有效&#xff0c;但当前的多任务ASR-AR方法忽视了任务之间的粒度差异。细粒度单元&#xff08;如音素、声韵母&#xff09;可用于捕获与发音相关的口音特征&…

利用阿里通义千问和Semantic Kernel,10分钟搭建大模型知识助手!

前言 **通义千问&#xff1a;**是阿里推出的一个超大规模的语言模型&#xff0c;其中参数模型Qwen-72B已经宣布开源&#xff0c;同时还开源了18亿参数模型Qwen-1.8B和音频大模型Qwen-Audio&#xff0c;至此已经开源了18亿、70亿、140亿、720亿参数的4款大语言模型&#xff0c;…

【QT】QGraphicsView和QGraphicsItem坐标转换

坐标转换 QGraphicsItem和QGraphicsView之间的坐标转换需要通过QGraphicsScene进行转换 QGraphicsView::mapToScene() - 视图 -> 场景QGraphicsView::mapFromScene() - 场景 -> 视图QGraphicsItem::mapToScene() - 图元 -> 场景QGraphicsItem::mapFromScene() - 场景 …

【leetcode234】回文链表Java代码讲解

12.21 234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&a…

【Java代码审计】URL跳转漏洞篇

【Java代码审计】URL跳转漏洞篇 1.URL跳转漏洞概述2.Java中的URL重定向3.URL跳转漏洞修复 1.URL跳转漏洞概述 通俗地说&#xff0c;目前很多的Web应用因为业务需要&#xff0c;需与内部的其他服务或者第三方的服务进行交互&#xff0c;这样就需要重定向的功能&#xff0c;由当…

上市十年 这家互联网服务平台窥见汽车市场“沧海桑田”

十年&#xff0c;对于一家上市公司而言意味着什么&#xff1f;以中概股为例&#xff0c;十年里的高低起伏&#xff0c;折射出不同公司和行业的各异命运。 新浪在2021年私有化退市&#xff0c;曾经名声在外的聚美优品在2020年遭遇同样命运。再往前数&#xff0c;还有离开美股回…

浅谈ASO优化如何应对市场竞争的挑战

随着应用市场的竞争越来越激烈&#xff0c;ASO优化也要为了应对各种来临的风险与机遇做出改变&#xff0c;提高自己的适应能力&#xff0c;下面小柚整理了一些思路供大家参考。 1. 深入了解目标用户需求&#xff1a;首先&#xff0c;需要深入了解目标用户的需求和痛点&#xf…

【LeetCode刷题笔记(11-1)】【Python】【和为 K 的子数组】【前缀和】【中等】

文章目录 引言和为 K 的子数组题目描述提示 解决方案1&#xff1a;【暴力枚举】解决方案2&#xff1a;【前缀和】结束语 和为 K 的子数组 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但…

985等高校急速开设“鸿蒙班”,引领IT就业新时代

​根据澎湃新闻记者了解到&#xff0c;华为以及鸿蒙系软件厂商都在积极培养鸿蒙开发人才。其中产学联动、产教融合来培养鸿蒙生态人才是重要的一条路径&#xff0c;目前已有 23 家 985 高校、46 家 211 高校已开设或即将开设HarmonyOS 相关课程。 其中南京大学已经将 HarmonyOS…

一套rk3588 rtsp服务器推流的 github 方案及记录 -03(完结)

opencv 解码记录 解码库使用的时候发现瑞芯微以前做过解码库对ffmpeg和gstreamer的支持 然后最近实在不想再调试Rtsp浪费时间了&#xff0c;就从这中间找了一个比较快的方案 ffmpeg 带硬解码库编译 编译流程参考文献 https://blog.csdn.net/T__zxt/article/details/12342435…

【网络安全】—Shell编程入门(2)

文章目录 循环控制语句函数知识精讲数组知识精讲开发环境规范调试优化实践自动化实战项目 在前面的章节中&#xff0c;我们已经介绍了Shell编程的基础知识&#xff0c;包括变量、特殊变量、数值计算、条件测试、条件判断和基本的循环语句。接下来&#xff0c;我们将深入讲解更高…

还在用QQ拼音输入法吗?赶快卸载吧~!

最近总觉得我的C盘在莫名其妙的减少。之前的电脑C盘只有240G&#xff0c;所以我很在意C盘空间。但是&#xff0c;我发现买了新电脑&#xff0c;C盘空间也在莫名其妙减少。 随挨个文件夹检查。最后发现&#xff0c;QQ拼音的 dict 文件夹很大&#xff0c;居然有 30G多G。 30多~…

华为安防监控摄像头

华为政企42 华为政企 目录 上一篇华为政企城市一张网研究报告下一篇华为全屋wifi6蜂鸟套装标准

Linux学习(3)——基本命令-文件

1、cat&#xff1a;查看文件内容--上下合并文件 注意&#xff1a;cat只能查看普通的文本文件 如果文件内容过多会显示不全 选项效果-n显示行号包括空行-b跳过空白行编号&#xff1b;注意&#xff0c;在一行打了空格不算空白行&#xff0c;enter键直接跳过这一行才算-s将所有连续…