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

介绍:

        进程是程序执行的实体,可将其理解为程序。比如:当我们使用文本编辑器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.mzph.cn/news/237029.shtml

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

相关文章

Vuex的学习-2

Vuex的核心概念 StateMutationAction 1.State State提供唯一的公共数据源&#xff0c;所有共享的数据都统一放在Store的State中进行存储。 const store new Vuex.Store({state : { count: 0 } }) 这是渲染的页面 组件访问数据的第一种方式 组件访问数据的第二种方式 // 1…

MSPM0L1306例程学习-ADC部分(4)

MSPM0L1306例程学习系列 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 可以到TI官网下载并且安装SDK: https://www.ti.com.cn/tool/cn/download/MSPM0-SDK/ MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 今天要讲的例程是adc12_14bit…

mac电脑m1 arm架构安装虚拟机教程

1、准备一台虚拟机&#xff0c;安装CentOS7 常用的虚拟化软件有两种&#xff1a; VirtualBoxVMware 这里我们使用VirtualBox来安装虚拟机&#xff0c;下载地址&#xff1a;Downloads – Oracle VM VirtualBox 001 点击安装 002 报错&#xff1a;he installer has detected an…

用模型预测测试数据

Hi, I’m Shendi 2、用模型预测测试数据 在之前已经训练好了一个模型&#xff0c;可以通过 model.save("path") 来保存模型到硬盘&#xff0c;下次直接使用。 这个模型使用的 mnist 数据集训练&#xff0c;这个数据集包含6万训练样本和一万测试样本&#xff0c;28*28…

linux下的进程组与会话的区别

进程组&#xff08;Process Group&#xff09;和会话&#xff08;Session&#xff09;是Unix/Linux操作系统中的两个概念&#xff0c;它们之间有一些关键区别&#xff1a; 定义和范围&#xff1a;一个进程组是一组相关进程的集合&#xff0c;它们具有相同的进程组ID&#xff08…

【运维面试100问】(十一)淡淡I/O过程

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

华为云之ECS云产品快速入门

华为云之ECS云产品快速入门 一、ECS云服务器介绍二、本次实践目标三、创建虚拟私有云VPC1.虚拟私有云VPC介绍2.进入虚拟私有云VPC管理页面3.创建虚拟私有云4.查看创建的VPC 四、创建弹性云服务器ECS——Linux1.进入ECS购买界面2.创建弹性云服务器(Linux)——基础配置步骤3.创建…

DC-磁盘管理

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 在DC2上安装及配置软RAID 5。在安装好的DC2虚拟机中添加三块10G虚拟磁盘。组成RAID 5,磁盘分区命名为卷标H盘:Raid5。手动测试破坏一块磁盘,做RAID磁盘修复,确认RAID 5配置完毕。配置步骤 关闭虚拟机,添加3块10G磁…

【AI提示词艺术】第10期 ---希望、价值与魔法的交织:小女孩与梦幻背景的数字艺术之旅

金色猎犬被视为一种贵族犬种 金色猎犬是一种流行的犬种&#xff0c;通常被视为一种象征&#xff0c;代表着忠诚、勇气和敏锐的嗅觉。这种犬种有着悠久的历史&#xff0c;可以追溯到中世纪时期。 金色猎犬的外观特征是短而厚的毛发&#xff0c;金色的颜色&#xff0c;以及敏锐…

Python---TCP 网络应用程序开发流程

1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发 说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序&#xff0c;专门为客户端提供数据服务。 2. TCP 客户端程序开发流程的介绍 步…

在GitHub找开源项目

在 GitHub 的搜索框里&#xff1a; 使用搜索关键词可以在 GitHub 上快速的找你需要的开源项目&#xff1a; 限制搜索范围 通过 in 关键词 (大小写不敏感) 限制搜索范围&#xff1a; 公式搜索范围in:name xxx项目名包含xxxin:description xxx项目描述包含xxxin:readme xxx项目…

C/C++ 使用 MySQL API 进行数据库操作

C/C 使用 MySQL API 进行数据库操作 一、前言 随着信息时代的到来&#xff0c;数据库的应用日益广泛&#xff0c;MySQL 作为开源的关系型数据库管理系统&#xff0c;被广大开发者所喜爱。在 C/C 程序中&#xff0c;我们可以通过 MySQL 提供的 API 接口来连接数据库&#xff0…

100GPTS计划-AI学术AcademicRefiner

地址 https://chat.openai.com/g/g-LcMl7q6rk-academic-refiner https://poe.com/AcademicRefiner 测试 减少相似性 增加独特性 修改http://t.csdnimg.cn/jyHwo这篇文章微调 专注于人工智能、科技、金融和医学领域的学术论文改写&#xff0c;秉承严格的专业和学术标准。 …

Windows 如何在局域网中建立NTP服务器实现时间同步(设置一台设备作为主机,其他设备作为从机来同步时间)

首先简单了解一下什么是NTP 网络时间协议(NTP)是一种用于同步计算机网络上各设备时间的协议。NTP时间同步在许多项目和应用中都是关键的&#xff0c;特别是那些对时间同步精度有要求的场景。比如需要使用NTP时间同步的情况有&#xff1a;金融交易系统、科学研究实验、工业自动…

Unity 创建/删除/启用/禁用组件的惯用方法

1、创建组件&#xff1a; Unity 创建组件可以通过编辑器中的"Add Component"创建&#xff0c;或者代码动态创建&#xff1a;GameObject.AddComponent<T>()&#xff0c;如&#xff1a; ameObject.AddComponent<Rigidbody>(); 2、删除组件&#xff1a; …

WPF组合控件TreeView+DataGrid之TreeView封装

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; wpf的功能非常强大&#xff0c;很多控件都是原生的&#xff0c;但是要使用TreeViewDataGrid的组合&#xff0c;就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

医院影像科PACS系统源码,医学影像系统,支持MPR、CPR、MIP、SSD、VR、VE三维图像处理

PACS系统是医院影像科室中应用的一种系统&#xff0c;主要用于获取、传输、存档和处理医学影像。它通过各种接口&#xff0c;如模拟、DICOM和网络&#xff0c;以数字化的方式将各种医学影像&#xff0c;如核磁共振、CT扫描、超声波等保存起来&#xff0c;并在需要时能够快速调取…

Python之json模块和pickle模块详解

json模块和pickle模块的用法 在python中&#xff0c;可以使用pickle和json两个模块对数据进行序列化操作。 其中&#xff1a; json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作。 pickle可以用于python特有类型与python数据类型之间的序列化与反序…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#…

Redis基础篇-002 初识Redis

1、认识NoSQL 1.1 概念 NoSQL是一个非关系型数据库。 常见的NoSQL有&#xff1a;Redis、MongoDB 1.2 NoSQL与SQL的区别 类别SQLNoSQL数据结构结构化非结构化数据关联关联非关联查询方式SQL非SQL事务特性ACIDBASE存储方式磁盘内存扩展性垂直水平使用场景1&#xff09;数据结…