Linux——进程

目录

一、基本概念

二、描述进程-PCB

(一)task_struct-PCB的一种

[(二)task_ struct内容分类](#(二)task_ struct内容分类)

三、查看进程

(一)利用ps命令

[(二) 通过 /proc 系统文件夹查看](#(二) 通过 /proc 系统文件夹查看)

(三)proc是动态目录结构,存放所有存在的进程,目录的名称,就是以这个进程的id命名

四、通过系统调用获取进程标示符(getpid和getppid)

(一)下载getpid手册

(二)使用getpid

(三)使用getppid

五、通过系统调用创建进程-fork

(一)认识fork

(二)fork有两个返回值

[(三)用 if 进行分流](#(三)用 if 进行分流)


一、基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体
  • 进程 = 可执行程序 + 内核数据结构(PCB)

二、描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

(一)task_struct-PCB的一种

  • 在Linux中描述进程的结构体叫做task_struct
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息

(二)task_ struct内容分类

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

三、查看进程

(一)利用ps命令

cpp 复制代码
ps ajx//列出所有用户的所有进程的详细信息
cpp 复制代码
ps ajx | head -1 && ps ajx | grep mybin
//ps ajx | head -1 获取当前运行的所有进程的列标题
//ps ajx | grep mybin 在所有进程中寻找包含关键词 "mybin" 的进程

(二) 通过 /proc 系统文件夹查看

cpp 复制代码
ls /proc/  ---用于列出系统中所有正在运行的进程的相关信息

(三)proc是动态目录结构,存放所有存在的进程,目录的名称,就是以这个进程的id命名

cpp 复制代码
ls /proc/7976 -dl//显示进程ID为7976的进程的目录信息,而不显示目录中的内容

四、通过系统调用获取进程标示符(getpid和getppid)

  • 进程id(PID)
  • 父进程id(PPID)

(一)下载getpid手册

cpp 复制代码
sudo yum install -y man-pages

(二)使用getpid

cpp 复制代码
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
    int i = 0;
    while (i <= 100)
    {
         pid_t id = getpid();
         printf("My process id is:%d\n", id);
         sleep(1);
    }
     return 0;
}

使用kill

cpp 复制代码
kill -9 32212//强制终止PID为32212的进程(-9表示强制)

(三)使用getppid

cpp 复制代码
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
    int i=0;
    while(i<=100)
    {      
        printf("I am a process, myid: %d, parent id: %d\n",getpid(),getppid());                     
        sleep(1);                                    
     }                                    
    return 0;      
} 

五、通过系统调用创建进程-fork

(一)认识fork

cpp 复制代码
while :;do ps ajx | head -1 && ps ajx | grep mybin;sleep 1;echo "#------------------------------------------------------------------------------------------------------------------------------------------------------------#";done
  • 在fork函数被调用之前的代码被父进程执行
  • 父子进程代码共享(fork之后,父子进程回执行一样的代码),但是数据各自开辟空间,私有一份(采用写时拷贝)
  • 以父进程为模板,为子进程创建PCB

(二)fork有两个返回值

  • fork成功的时候,会有两个不同的返回值,给子进程返回0,给父进程返回子进程的pid
  • fork失败的时候,则在父进程中返回 -1

(三)用 if 进行分流

相关推荐
Ivanqhz4 分钟前
数据搬运是性能关键
java·服务器·网络·人工智能·深度学习
其实防守也摸鱼11 分钟前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
Julien200427 分钟前
自动挂载网络附加存储
linux·服务器·网络
codigger1 小时前
服务器又卡了?一篇讲透 Linux 性能排查(基础四件套 + perf/strace/火焰图)
linux·后端·性能优化
顶点多余1 小时前
9.18 面试题总结 --- 绿盟
linux·面试
^Rocky1 小时前
IT 疑难杂症诊疗室:复杂技术问题解决实录
运维·bug
Ivanqhz1 小时前
Slope One 算法详解:与矩阵分解、共现矩阵的异同
java·服务器·网络·人工智能·深度学习
挖掘狂人2 小时前
当生产环境"变慢",我用这套 perf + strace 30 分钟定位瓶颈
linux·运维·性能优化
Wang's Blog2 小时前
Java 项目实战: 外卖平台-数据库环境搭建与十一张表结构解析
java·服务器·redis
王六米。2 小时前
RAG知识库建设 文档解析 切分与索引如何衔接
服务器·前端·网络·企业数字化转型·智钳智能盒子