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

相关推荐
单音GG19 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
Shepherd06191 小时前
【Jenkins实战】Windows安装服务启动失败
运维·jenkins
shitian08111 小时前
用轻量云服务器搭建一个开源的商城系统,含小程序和pc端
服务器·小程序·开源
Biomamba生信基地1 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
米饭是菜qy1 小时前
TCP 三次握手意义及为什么是三次握手
服务器·网络·tcp/ip
yaoxin5211231 小时前
第十九章 TCP 客户端 服务器通信 - 数据包模式
服务器·网络·tcp/ip
new_abc2 小时前
Ubuntu 22.04 ftp搭建
linux·运维·ubuntu
flying robot2 小时前
RPM的使用
linux
鹿鸣天涯2 小时前
‌华为交换机在Spine-Leaf架构中的使用场景
运维·服务器·网络