目录
1. 什么是进程?
2. 描述进程---PCB
task_struct---PCB的一种
task_ struct内容分类
3. 组织进程
4. 查看进程
通过系统调用获取进程标示符
通过系统调用创建进程---fork初识
1. 什么是进程?
其实,我们启动一个软件,本质就是启动了一个进程!
在Linux中,运行一条命令:./xxx,运行的时候,其实就是在系统层面创建了一个进程!
Linux是可以同时加载多个程序的,Linux是可能同时存在大量的进程在系统中的(OS,内存) 那么Linux要不要管理进程呢?答案是必须的! 如何管理:先描述,再组织。
2. 描述进程---PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。(Linux下一切皆文件,文件 = 属性 + 内容)
- 我们将进程控制块称之为PCB(process control block),Linux操作系统下的PCB是: task_struct
task_struct---PCB的一种
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
task_ struct内容分类
- 标示符(id): 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
3. 组织进程
4. 查看进程
ls /proc //以文件方式查看进程
大多数进程信息同样可以使用top和ps这些用户级工具来获取
top : 查看所有进程信息,类似Windows下任务管理器
但是我们更推荐用 ps 查看进程信息!!!
通过系统调用获取进程标示符
- 进程id(PID)
- 父进程id(PPID)
代码示例:
运行:
通过系统调用创建进程---fork初识
fork 功能:创建一个子进程 fork 特点: 1. 创建失败返回-1,创建成功给父进程返回子进程id,给子进程返回0. 2. fork后会从原来一个进程分流分两个进程(父进程和子进程),fork后两进程共享后面代码。
因为fork后两进程代码共享,所以父进程,子进程都会打印第二个printf语句,只是id不同罢了。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0)//即-1
{
printf("创建进程失败!\n");
perror("fork");
return 1;
}
else if(ret == 0)//子进程
{
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}
else//父进程
{
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
tip:父子进程被创建出来,哪一个进程先运行呢?
不一定!谁先运行,这个是由操作系统的调度器决定的。