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

相关推荐
老汉忒cpp2 分钟前
手动部署并测试内网穿透(ssh 和 nginx)
运维·服务器
有时间要学习4 分钟前
Linux——应用层自定义协议与序列化
linux·服务器·网络
阑梦清川14 分钟前
简明linux系统编程--互斥锁--TCP--UDP初识
linux·udp·tcp·互斥锁·信号·解锁·加锁
hardStudy_h18 分钟前
Linux——常用系统设置和快捷键操作指令
linux·运维·服务器
我叫啥都行44 分钟前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
XF鸭1 小时前
TCP 和 UDP 协议的区别?
linux
qq 1778036222 小时前
智能新时代,游戏盾守护顺畅体验
运维·服务器·网络·游戏·云计算·ddos·ip
Flying_Fish_roe2 小时前
linux-安全管理-防火墙与网络安全
linux·数据库·oracle
不见长安见晨雾3 小时前
Linux:vim编辑技巧
linux·编辑器·vim
神秘的土鸡3 小时前
Linux中使用Docker容器构建Tomcat容器完整教程
linux·运维·服务器·docker·容器·tomcat