Linux:进程(一)

目录

一、概念的理解

二、指令操作


一、概念的理解

        在许多地方对进程的定义都是这样的一句话:加载到内存中的程序、正在运行的程序、进程可以排队······

        而要真正理解进程是什么,这一句话的解释远远不够。

        在定义进程之前,先来理解程序,我们存储在计算机磁盘(当前,现在的设备多是固态硬盘,一个意思)的可运行程序是一个二进制文件,是要交给计算机的CPU来执行的,那么磁盘属于外设,根据冯诺依曼的计算机体系结构,外设不能直接和CPU传输数据,而是中间要经过内存

        那么,这个可运行程序就会加载到内存。

        那么,加载到内存以后,这就是进程了吗?


        事实上,我们可以同时启动多个程序,那么就意味着有多个程序被加载到内存。

        那么,操作系统必定要对这些加载到内存中的程序做管理

        而提到管理,必然离不开“先描述、再组织”,即先面向对象,再数据结构。

        于是,在一个程序加载到内存后,操作系统内核也会定义一个结构体变量跟踪管理这个程序。这个结构体变量称为进程控制块PCB(process control block),它内部包含这个进程的所有信息。

        Linux中描述PCB的结构体是task_struct


        因此,进程真正的理解为:

        (先描述,PCB是结构体,利用面向对象的思想)进程 = 内核PCB + 可执行程序

        (再组织,有了结构体,管理结构体利用数据结构)进程 = 内核数据结构(一般是链表) + 可执行程序。


        Linuxtask_struct结构体变量的内容大致分类:

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

        那么,我们作为用户,如何查看进程信息。这里有一个逻辑关系,PCB是内核结构体变量,属于操作系统内部变量,因此只能使用系统调用接口system call做相关操作。

二、指令操作

  • 所有进程的目录
/proc/

        如果你想查看PID为1的进程信息,你可以查看下面这个目录

/proc/1
  • 打印进程的指令
ps axj

        psprocess的缩写,功能是显示当前系统的进程状态axj分别是-a、-x、-j三个参数。


        新建一个目录,比如24915,在该目录下新建源文件,同时配置Makefile文件。

[euto@VM-4-13-centos 24915]$ touch myprocess.c
[euto@VM-4-13-centos 24915]$ ls
myprocess.c
[euto@VM-4-13-centos 24915]$ ls > Makefile
[euto@VM-4-13-centos 24915]$ ls
Makefile  myprocess.c

        配置Makefile文件。

[euto@VM-4-13-centos 24915]$ cat Makefile 
myprocess:myprocess.cgcc -o $@ $^ -std=c99
.PHONY:clean
clean:rm -f myprocess

        编辑源文件。

[euto@VM-4-13-centos 24915]$ cat myprocess.c 
#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("i am a process!\n");sleep(1);}return 0;
}

        编译完成后,执行该程序。

[euto@VM-4-13-centos 24915]$ ./myprocess 
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
i am a process!
······

        同时,再观察进程信息。

[euto@VM-4-13-centos 24915]$ ps axj | head -1 && ps axj | grep myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
28701 15839 15839 28701 pts/1    28701 T     1001   0:00 ./myprocess
17253 20133 20132 17253 pts/2    20132 S+    1001   0:00 grep --color=auto myprocess
//打印的第二行是因为,grep本身也是可执行程序,即进程,在执行grep的时候
//这个可执行程序的参数带有myprocess的字眼
//可以使用grep 的 -v选项过滤掉这一行
[euto@VM-4-13-centos 24915]$ ps axj | head -1 && ps axj | grep myprocess | grep -v grepPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
28701 15839 15839 28701 pts/1    28701 T     1001   0:00 ./myprocess
  • 几乎所有的指令也是可执行程序,当执行指令操作后,也会成为进程

        下面,为了方便观察进程,让打印进程的指令做循环操作,不断检测进程状态。

//while true
//do
//   a
//   b
//   ···
//done
[euto@VM-4-13-centos 24915]$ while :; do ps ajx | head -1 && 
>ps ajx | grep myprocess | grep -v grep;
>sleep 1;
>donePPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
················

        执行可执行程序myprocess后,观察到进程从无到有的过程:

[euto@VM-4-13-centos 24915]$ while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; donePPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569  9385  9385  2569 pts/1     9385 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569  9385  9385  2569 pts/1     9385 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569  9385  9385  2569 pts/1     9385 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569  9385  9385  2569 pts/1     9385 S+    1001   0:00 ./myprocess

        我们已经知道PCB属于内核数据,想要访问PCB需要系统调用接口system call。获取PID的命令名为getpid

//执行man getpid查看相关信息GETPID(2)                  Linux Programmer's Manual                 GETPID(2)NAMEgetpid, getppid - get process identificationSYNOPSIS#include <sys/types.h>#include <unistd.h>pid_t getpid(void);pid_t getppid(void);
··········

        结果显示getpid是2号手册的内容。

//执行man man查看手册的描述1   Executable programs or shell commands//2号手册描述系统调用接口的使用2   System calls (functions provided by the kernel)3   Library calls (functions within program libraries)4   Special files (usually found in /dev)5   File formats and conventions eg /etc/passwd6   Games7   Miscellaneous  (including  macro  packages  and  conventions), e.g.man(7), groff(7)8   System administration commands (usually only for root)9   Kernel routines [Non standard]

        修改源文件内容。

[euto@VM-4-13-centos 24915]$ cat myprocess.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{pid_t id = getpid();while(1){printf("i am a process! id: %d \n",id);sleep(1);}return 0;
}

        和原来一样的操作打印进程信息,观察进程从无到有的过程:

[euto@VM-4-13-centos 24915]$ while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; donePPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569 18465 18465  2569 pts/1    18465 S+    1001   0:00 ./myprocessPPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2569 18465 18465  2569 pts/1    18465 S+    1001   0:00 ./myprocess

        程序运行结果显示:

i am a process! id: 18465 
i am a process! id: 18465 
i am a process! id: 18465 
i am a process! id: 18465 
·······

        一般在Linux中,普通进程都有父进程且唯一,而一个进程可能是多个子进程的父进程。

//查看getppid的使用方法
man getppid

        同上一个操作一样,修改源文件,观察进程信息。

[euto@VM-4-13-centos 24915]$ ./myprocess 
i am a process! id: 23894,fid: 2569 
i am a process! id: 23894,fid: 2569 
^C
[euto@VM-4-13-centos 24915]$ ./myprocess 
i am a process! id: 23982,fid: 2569 
i am a process! id: 23982,fid: 2569 
^C
[euto@VM-4-13-centos 24915]$ ./myprocess 
i am a process! id: 23992,fid: 2569 
i am a process! id: 23992,fid: 2569 
^C

        不难发现,普通进程,每次启动后,PID都是随机变化的,但是父进程是唯一不变的。但是进程2569到底是什么程序呢?

[euto@VM-4-13-centos 24915]$ ps ajx | head -1 && ps axj | grep 2569PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND2562  2569  2569  2569 pts/1     2569 Ss+   1001   0:00 -bash3778 26700 26699  3778 pts/2    26699 S+    1001   0:00 grep --color=auto 2569

        关于bash,bash是Shell的其中一种

        Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

        Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

        Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

        Bash即命令解释器,在命令行启动的程序,都是Bash的子进程。 

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

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

相关文章

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

MATLAB系列06:复数数据、字符数据和附加画图类

MATLAB系列06&#xff1a;复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量&#xff08; complex variables&#xff09;6.1.2 带有关系运算符的复数的应用6.1.3 复函数&#xff08; complex function&#xff09;6.1.4 复数数据的作…

【FPGA】编程方式

FPGA编程方式 1 什么是PLD&#xff1f;2 什么是颗粒度&#xff1f;3 可编程逻辑器件的编程方式有哪些&#xff1f;3.1 SRAM 编程技术3.2 Flash/EEPROM 编程技术3.3 反熔丝编程技术3.4 编程技术比较 参考资料 1 什么是PLD&#xff1f; 可编程逻辑器件 英文全称为&#xff1a;pr…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

c语言面试字符串复制

1&#xff0c;下面这个函数的打印是什么&#xff1a; #include<stdio.h> #include<string.h>int main() {char str0[5], str1[] "welcome";strcpy(str0, str1);printf("str0:%s\r\n",str0);printf("str1:%s\r\n",str1); } larkla…

nginx实现https安全访问的详细配置过程

文章目录 前言什么是 HTTP&#xff1f;什么是 HTTPS&#xff1f;HTTP 和 HTTPS 的区别为什么 HTTPS 被称为安全的&#xff1f;配置过程配置自签名证书 前言 首先我们来简单了解一下什么是http和https以及他们的区别所在. 什么是 HTTP&#xff1f; HTTP&#xff0c;全称为“超…

notepad++的json查看

json文件查看 因为接触到3dtile模型&#xff0c;所以经常需要和json打交道&#xff0c;但是很多模型是下面这种情况&#xff0c;不好阅读&#xff0c;所以可以使用notepad的插件查看 正常打开是这样的 加载notepad插件 搜索json下载安装就可以了 如果网络抽象&#xff0c;下载…

Hive企业级调优[3]—— Explain 查看执行计划

Explain 查看执行计划 Explain 执行计划概述 EXPLAIN 命令呈现的执行计划由一系列 Stage 组成。这些 Stage 之间存在依赖关系&#xff0c;每一个 Stage 可能对应一个 MapReduce Job 或者一个文件系统的操作等。如果某 Stage 对应了一个 MapReduce Job&#xff0c;则该 Job 在 …

Apache James配置连接达梦数据库

项目场景&#xff1a; Apache James配置连接达梦数据库&#xff0c;其他配置中不存在的数据库也可参考此方案。 配置步骤 1、把需要的jar包导入到James 把DmJdbcDriver18.jar复制到下面lib目录下 james-2.3.2\lib 2、 修改连接配置 james-2.3.2\apps\james\SAR-INF\confi…

C# 技巧在 foreach 循环中巧妙获取索引

目录 前言 使用 LINQ 和扩展方法 直接在 LINQ 查询中使用 使用 LINQ 的 Select() 与 Enumerable.Range() 总结 最后 前言 在C#中foreach 循环是处理集合的常见方式&#xff0c;因其简洁性和易读性而广受青睐。 但是在某些情况下&#xff0c;我们需要同时获取集合中元素的…

[深度学习]神经网络

1 人工神经网络 全连接神经网络 2 激活函数 隐藏层激活函数由人决定输出层激活函数由解决的任务决定: 二分类:sigmoid多分类:softmax回归:不加激活(恒等激活identify)2.1 sigmoid激活函数 x为加权和小于-6或者大于6,梯度接近于0,会出现梯度消失的问题即使取值 [-6,6] ,…

头戴式蓝牙耳机性价比高的有哪些?四款高能性价比机型对比推荐

在当今科技日新月异的时代&#xff0c;头戴式蓝牙耳机已经成为了我们日常生活中不可或缺的一部分&#xff0c;无论是通勤路上、健身房内还是家中休闲时&#xff0c;一副优质的头戴式蓝牙耳机都能为我们带来沉浸式的听觉体验&#xff0c;那么头戴式蓝牙耳机性价比高的有哪些&…

模版结构体没有可用成员(C3203)

没有typedef模版结构体而导致。 并且_tables[index]无法访问HashData内部的成员。

Windows系统使用PHPStudy搭建Cloudreve私有云盘公网环境远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

Vue(13)——router-link

router-link vue-router提供了一个全局组件router-link(取代a标签) 能跳转&#xff0c;配置to属性指定路径&#xff08;必须&#xff09;。本质还是a标签。默认会提供高亮类名&#xff0c;可以直接设置高亮样式 右键检查&#xff0c;发现多了两个类&#xff1a; 可以直接写样式…

【Python】探索 Errbot:多功能聊天机器人框架

不是旅行治愈了你&#xff0c;是你在路上放过了自己。 在当今的数字化时代&#xff0c;聊天机器人已成为企业与客户互动、提升工作效率和增加乐趣的重要工具。Errbot是一个高度可扩展的聊天机器人框架&#xff0c;它允许开发者使用Python轻松创建和定制机器人。本文将介绍Errb…

大型语言模型 (LLM) 劫持攻击不断升级,导致每天损失超过 100,000 美元

Sysdig 威胁研究团队 (TRT) 报告称&#xff0c;LLMjacking&#xff08;大型语言模型劫持&#xff09;事件急剧增加&#xff0c;攻击者通过窃取的云凭证非法访问大型语言模型 (LLM)。 这一趋势反映了 LLM 访问黑市的不断增长&#xff0c;攻击者的动机包括个人使用和规避禁令和制…

【webpack4系列】编写可维护的webpack构建配置(四)

文章目录 构建配置包设计功能模块设计和目录结构设计功能模块设计目录结构设计 使用ESLint规范构建脚本冒烟测试介绍和实际运用冒烟测试 (smoke testing)冒烟测试执行判断构建是否成功判断基本功能是否正常 单元测试和测试覆盖率测试框架编写单元测试用例单元测试接入测试覆盖率…

Ubuntu截图工具flameshot

最近在使用香橙派做一些东西&#xff0c;有些内容需要截图记录&#xff0c;这里记录一下截图工具的安装和使用过程&#xff0c;方便以后查阅。 Ubuntu截图工具flameshot flameshot 简介flameshot 安装flameshot 相关命令 flameshot 简介 linux系统里面最好用的截屏工具支持图形…

基于python+django+vue的旅游网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…