从0开始linux(9)——进程(1)进程管理

news2024/12/23 0:19:49

欢迎来到博主的专栏:从0开始linux
博主ID:代码小豪

文章目录

    • 查看进程
    • 进程管理
    • PID与PPID
    • fork函数

在上一篇中我们了解到:当运行程序时,操作系统会将磁盘中的二进制文件读取到内存当中,程序运行到结束的过程称为进程,并且操作系统使用一个task_struct的结构体来管理进程。

查看进程

使用ps ajx指令可以查看当前的进程信息。
在这里插入图片描述
由于linux需要运行大量的系统程序,所以直接查看全部进程的信息并不明智,因此最好使用检索特定命令的指令ps ajx | grep [name],这里的|是管道,作用是将管道前面的指令的运行结果,交给管道后的指令去执行,比如ps ajx的结果是打印当前的全部进程,而grep的作用是搜索关键词,因此这个指令的意义是:在全部进程中检索[name]的程序的结果打印出来。

比如我们查看bash程序的进程信息,则输入

ps ajx | grep bash

在这里插入图片描述

但是这样做虽然能看到指定的进程的信息,但是我们由于看不到进程信息的对应属性,因此并不知道进程信息代表的意思是什么,因此博主推荐使用一个组合命令:ps ajx | head -1;ps ajx | grep [name]。分号的作用是将多个指令的结果同时执行。因此,我们输入:

ps ajx | head -1; ps ajx | grep bash

在这里插入图片描述
之所以这段指令可以看到进程信息的对应属性,是因为进程属性在ps ajx 的结果的第一行,因此现将第一行的信息打印,就能看到进程信息的对应属性了。在这里插入图片描述

进程管理

既然说二进制文件运行之后就会变成进程,那么我们来尝试写一个简单的代码。
在这里插入图片描述
我们将这段代码编译生成的二进制文件命令为hello_world。然后将其运行,接着输入
ps ajx | head -1;ps ajx | grep hello_world
在这里插入图片描述
此时奇怪的事情发生了,hello_world竟然没有被搜索到,上面只有一个grep --color=auto hello_world的进程,因为执行的指令也算进程。

那么这个hello_world去哪了呢?博主刚刚才提到,指令也算进程,那么这是否意味着,ls指令也能在进程管理中看到呢?事不宜迟,我们赶紧测试一下
在这里插入图片描述
可以发现,ls也是查看不到的,,那么为什么ls和hello_world都属于是进程,但是我们却看不到呢?其实原因很简单,因为一个进程,其实是一个程序从运行到结束的整个过程,而无论是hello_world,还是ls指令,它们的执行的过程其实非常短,短到我们难以通过进程管理去看到它们就已经结束了运行,像这种瞬时的进程我们是很难观察到的。

PID与PPID

既然瞬时的进程我们看不到信息,那么我们修改一下代码让其进入死循环呗,修改的代码如下:
在这里插入图片描述
接着我们运行代码,并且打开另外一个终端来查看查看进程。(ps:linux运行同一个用户使用不同的命令窗口,如下,博主使用的是同一个用户来执行不同的指令)
在这里插入图片描述
我们让其中一个窗口运行程序,另外一个窗口输入ps ajx | head-1 ;ps ajx | grep hello_world
在这里插入图片描述
现在,我们已经知道如何查看进程的状态了,但是关于这些状态的属性代表什么意思却不太了解,我们先来认识一下pid和ppid。
在这里插入图片描述
pid,英文全称为:Process Identifier,也可称为进程标识符,顾名思义,pid就是一个进程的标识符,当一个程序运行时,系统会为其进程自动分配一个进程标识符。

pid的类型是符号型整数,在linux c中,通常用pid_t类型的变量来接收pid的值。

getpid函数
getpid函数被包含在头文件<unistd.h>当中,该头文件中的函数通常都是与系统调用相关的函数,并不适用于windows系统。

getpid,返回调用该函数的进程的ID,比如,我们写下如下的代码:
在这里插入图片描述

编译该代码,并让其生成二进制文件testproc,接着运行代码,并且查看一下testproc程序的进程信息。
在这里插入图片描述
可以发现,程序中getpid的返回值,与testproc进程的实际pid一致,因此getpid的作用就是获得当前程序的pid。

每个进程都有其对应的pid,而进程与pid的关系有点像指针与变量,很多时候,我们要对进程进行管理时,都是使用pid,而非进程本身的名字。

关闭进程
关闭进程需要用到kill指令,kill指令本身不单单能关闭进程,还有许多关于管理进程的选项,我们输入kill -l可以看到与kill相关的所有选项
在这里插入图片描述
想要在一篇中,讲完kill的全部选项不太现实,因此博主将会在与进程相关的文章中,一边用,然后一边讲这些选项所代表的操作。

想要关闭进程,我们就要用选项(9),这个选项能让进程强行被关闭。具体指令如下:
kill -9 [pid]

现在,我们继续运行testproc程序。
在这里插入图片描述
现在我们在另一个窗口中输入:

kill -9 11759

在这里插入图片描述
可以发现,程序停止了,并且还有killed的信息以表示该进程已被停止,像这种强行把进程关闭的行为,我们称之为:杀进程。

** ppid**
在linux中,ppid指的是父进程的pid,即父进程的pid。当一个进程被创建时,创建它的那个进程被称作父进程。使用“ps ajx | grep [name]”命令来查看。

我们再次运行testproc程序,然后在另一个窗口当中使用ps ajx |head -1;ps ajx | grep testproc查看testproc的进程信息。
在这里插入图片描述

那么testproc的ppid是testproc的父进程的pid,那么我们就可以用ppid去看看testproc的父进程是谁。指令如下:

ps ajx | head -1 ; ps ajx | grep 11674

在这里插入图片描述
这里发现,原来testproc的父进程是bash,至于为什么是bash博主先不谈,因为这涉及其他方面的知识,我们后面再聊。但是现在我们知道了,如果一个进程的ppid,其实就是其父进程的pid。

get ppid函数

get ppid函数可以返回当前进程的ppid。包含在头文件<unistd.h>当中,这个函数很简单,博主就不再展示它的用法了,和getpid的使用方法是一样的。

fork函数

好了,我们现在知道了父进程与子进程之间的关系,但是我们还没怎么见过父进程与子进程,但是没事,博主给大家介绍一个fork函数,这个函数能展示linux的父子进程之间的关系,还能展示linux系统的多线程功能。

我们打开man手册看看fork函数是怎么描述的
在这里插入图片描述
fork包含在头文件<unistd.h>当中。
在这里插入图片描述
Fork()通过复制调用进程来创建一个新进程。这个新进程,被称为子过程,该子进程是父进程的一份拷贝,子进程与父进程都会从代码的同一位置开始执行线程。

这段话该怎么理解呢?我们以一个例子举例。
在这里插入图片描述
接着我们运行代码。在这里插入图片描述
可以发现,运行这段代码多一个未知进程的pid,根据fork函数当中的描述,我们可以大胆的猜测这个新的进程就是fork出来的子进程。我们修改源代码,让进程将各自的ppid打印出来。
在这里插入图片描述
在这里插入图片描述
到这里就很明显,当程序执行到fork时,会产生一个子进程,子进程与自己拥有一样的代码,但是数据不互通,而该子进程会从fork的位置开始继续运行程序。

在这里插入图片描述
关于fork的介绍就到此结束了吗?当然没有,我们还没看返回值呢。
在这里插入图片描述
如果fork成功创建了子进程,那么fork向子进程返回值为0,向父进程的返回值为子进程的pid,如果创建失败,则父进程的返回值为0,没有子进程生成。

利用这个特性我们就能让fork出来的子进程执行与子进程不同的事情。例子如下:

 int main()
 {
      pid_t id=fork();//如果是父进程,则fork的返回值是子进程的pid
      //如果是子进程,则返回值为0
      if(id>0)//父进程执行
      {
          printf("i'm parent process pid:%d\n",getpid());
      }
      else if(id==0)//子进程执行
      {
         printf("i'm child process pid:%d;ppid%d\n",getpid(),getppid());
     }
     else if(id==-1)//创建子进程失败执行                                                                                                                                                                  
     {
         printf("fork fail\n");
     }
     sleep(1);
     return 0;     
}

在这里插入图片描述
可以发现,利用fork的返回值,可以让父进程与子进程之间虽然代码共享,但是利用分支的关系,可以让子进程与父进程的运行过程不同。

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

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

相关文章

【C++ 11】auto 自动类型推导

文章目录 【 1. 基本用法 】【 2. auto 的 应用 】2.0 auto 的限制2.1 简单实例2.2 auto 与指针、引用、const2.4 auto 定义迭代器2.5 auto 用于泛型编程 问题背景 在 C11 之前的版本&#xff08;C98 和 C 03&#xff09;中&#xff0c;定义变量或者声明变量之前都必须指明它的…

目标检测YOLO实战应用案例100讲-【目标检测】YOLOV11

目录 前言 算法原理 YOLO发展历程 什么是 YOLO11 YOLOv11 的主要特点 YOLO各版本概览 核心优势: YOLOv11改进方向 YOLOv11功能介绍 YOLOv11关键创新 YOLOv11 指标展示 YOLOV11实验 环境设置 准备数据集 训练模型 验证模型 应用领域 一、智慧交通与自动驾…

【Linux实践】实验八:Shell程序的创建及变量

文章目录 实验八&#xff1a;Shell程序的创建及变量实验目的&#xff1a;实验内容&#xff1a;操作步骤&#xff1a;1. 查看环境变量2. 定义变量AK3. 定义变量AM并比较4. 创建Shell程序 实验八&#xff1a;Shell程序的创建及变量 实验目的&#xff1a; 掌握Shell程序的创建过…

【C++】AVL树的底层以及实现

个人主页 文章目录 ⭐一、AVL树的概念&#x1f389;二、AVL树的性质&#x1f3dd;️三、AVL树的实现1. 树的基本结构2. 树的插入3. 树的旋转• 左单旋• 右单旋• 左右双旋• 右左双旋 &#x1f3a1;四、AVL树的其它功能1. 树的查找2. 树的遍历3. 树的高度4. 树的大小 &#x…

RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍

🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…

vulnhub-matrix-breakout-2-morpheus靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell ①nc反弹shell连接 ②Webshell上传 3、提权 ①使用kali自带的poc ②使用msf进行渗透 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(19…

项目构建工具

一般面试中被问到的项目构建工具&#xff0c;常常会回答的是Maven 今天大概了解了一下目前项目构建构建有Maven,Ant,Gradle Gradle 是一个构建工具&#xff0c;它是用来帮助我们构建app的&#xff0c;构建包括编译&#xff0c;打包等过程。我们可以为Gradle指定构建规则&…

matlab 相关

1、xcorr 本质上是两个函数做内积运算 相关算法有两种&#xff1a; 在Matlab上既可以 1.用自带的xcorr函数计算互相关&#xff0c;2.通过在频域上乘以共轭复频谱来计算互相关&#xff1b; 网友验证程序 clc;clear;close all; % s1,s2为样例数据 s1 [-0.00430297851562500;-…

攻防世界----->Replace

前言&#xff1a;做题笔记。 下载 查壳。 upx32脱壳。 32ida打开。 先运行看看&#xff1a; 没有任何反应&#xff1f; 猜测又是 地址随机化(ASLR)---遇见过。 操作参考&#xff1a; 攻防世界----&#xff1e;Windows_Reverse1_dsvduyierqxvyjrthdfrtfregreg-CSDN博客 然后…

Spring系列 Bean创建过程

文章目录 初始化时机单例初始化流程getBeandoGetBeangetSingleton(String) 获取单例getSingleton(String, ObjectFactory) 创建单例beforeSingletonCreationcreateBeanafterSingletonCreation 创建 Bean 过程doCreateBeanaddSingletonFactory createBeanInstance 创建 Bean 对象…

医院管理智能化:Spring Boot技术革新

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

ctf.bugku - game1

题目来源&#xff1a; game1 - Bugku CTF 访问页面&#xff0c;让玩游戏 得到100分&#xff0c;没拿到flag 查看页面源码&#xff0c; GET请求带有 score、IP、sign 三个参数&#xff0c;最后的flag 应该跟分数有关&#xff1b; 给了score一个99999分数&#xff0c; sign 为 …

STM32编码器接口

一、概述 1、Encoder Interface 编码器接口概念 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用…

如何录制微课教程?K12教育相关课程录制录屏软件推荐

在当今数字化教育的时代&#xff0c;微课作为一种重要的教学资源&#xff0c;受到了越来越多教师和学生的关注。制作一节优质的微课&#xff0c;录制是关键的环节之一。下面我们将结合相关知识&#xff0c;详细介绍如何录制微课教程。 一、微课录制前的准备 1.教学设计文档编写…

Ultralytics:YOLO11使用教程

Ultralytics&#xff1a;YOLO11使用教程 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows YOLO11使用教程进行目标检测进行实例分割进行姿势估计进行旋转框检测进行图像分类 参考文献 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多…

题目:圆桌会议

解题思路&#xff1a; 结果的顺序就是原序列的逆序&#xff0c;例如12345就是54321为结果顺序。同时将一个顺序序列&#xff08;非环&#xff09;变成逆序需要的次数为。想要的得到最短的交换次数&#xff0c;只需要将环尽量对半分&#xff0c;然后分别对两部分进行顺序序列变逆…

DAY27||回溯算法基础 | 77.组合| 216.组合总和Ⅲ | 17.电话号码的字母组合

回溯算法基础知识 一种效率不高的暴力搜索法。本质是穷举。有些问题能穷举出来就不错了。 回溯算法解决的问题有&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集问题&#xff1a;一个N个数…

SeaTunnel如何创建Socket数据同步作业?

本文为Apache SeaTunnel Socket Connector的使用文档&#xff0c;旨在帮助用户快速理解和有效利用Socket Connector&#xff0c;助力用户的应用程序实现高效、稳定的网络通信。 Socket是应用层与TCP/IP协议族之间进行通信的中间软件抽象层&#xff0c;它是网络编程的基础&…

视频怎么做成扫码展示?视频二维码在线做的方法

视频想要快速的分享给其他人&#xff0c;选择生成二维码是一种很方便的形式&#xff0c;其他人只需要扫描二维码就可以在线查看视频&#xff0c;与其他分享方式相比更加的简单、方便。现在日常生活中有很多场景都会有视频二维码的应用&#xff0c;简化了获取视频的流程&#xf…

typora笔记导出word格式:

Pandoc&#xff1a;各系统下载github链接 https://github.com/jgm/pandoc/releases/latest windows安装包 链接&#xff1a;https://pan.baidu.com/s/17AZNIMImbzFtWJAcAfAB0g?pwd55l2 提取码&#xff1a;55l2 先解压压缩包 点击 设置Pandoc路径&#xff0c;然后选择pa…