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 进行分流

相关推荐
多吃蔬菜!!!21 分钟前
vscode 搭建C/C++开发环境搭建(linux)
linux·c语言·c++
李李李li29 分钟前
Ubuntu 22.04 安装tensorrt
linux·tensorrt
phoenix09812 小时前
Linux入门DAY29
linux·运维
一休哥助手2 小时前
Naive RAG:简单而高效的检索增强生成架构解析与实践指南
运维·人工智能·架构
叔叔别拉了我害怕3 小时前
封装FTPSClient连接ftps服务器
服务器·git·github
入秋3 小时前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
不甘懦弱3 小时前
阿里云搭建flask服务器
服务器·python·flask
Bi3 小时前
包含多个子项目集成一个项目部署Vercel方法
运维·前端
Mr. Cao code3 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278213 小时前
Linux 网络命令大全
linux·运维·网络