目录
[(二)task_ struct内容分类](#(二)task_ struct内容分类)
[(二) 通过 /proc 系统文件夹查看](#(二) 通过 /proc 系统文件夹查看)
(三)proc是动态目录结构,存放所有存在的进程,目录的名称,就是以这个进程的id命名
四、通过系统调用获取进程标示符(getpid和getppid)
[(三)用 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