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

相关推荐
杰锅就是爱情1 小时前
OpenObserve Ubuntu部署
linux·运维·ubuntu
lllsure2 小时前
【Docker】容器
运维·docker·容器
Jtti4 小时前
新加坡服务器连接速度变慢应该做哪些检查
运维·服务器
郝亚军4 小时前
websocket 服务器往客户端发送的数据要加掩码覆盖吗?
服务器·网络·websocket
DoWhatUWant4 小时前
域格YM310 X09移芯CAT1模组HTTPS连接服务器
服务器·网络协议·https
huangjiazhi_4 小时前
在Linux上无法访问usb视频设备
linux·运维·服务器
xixingzhe24 小时前
jenkins脚本触发部署
运维·jenkins
TTGGGFF4 小时前
云端服务器使用指南:如何跨机传输较大文件(通过windows自带工具远程桌面连接 非常方便)
运维·服务器
躲在云朵里`5 小时前
ElasticSearch复习指南:从零搭建一个商品搜索案例
运维·jenkins
yyy0002005 小时前
压缩和归档 文件传输
linux·运维·服务器