5 进程初步
一、认识进程
-- 进程Process是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
-- 程序运行起来就是一个进程
- 进程存在于运行内存中
- 程序存在于硬盘中
-- windows下查看进程使用任务管理器进行查看
1、查看进程的指令
-- linux下如何查看进程
- (1)ps 指令可以用来看进程 查看当前终端下的进程
-
(2)ps -ef 查看系统内所有进程
-- 该指令主要用来获取进程的进程号
-- PID:进程号
-- PPID:父进程号
-
(3)ps -aux
-- 主要用来获取进程间状态
-- STAT:表示进程的当前状态 -
(4)kill -9 进程号
-- 杀死进程指令
2、进程在系统中的调度状态
-- linux操作系统下进程的三种状态:
- 执行态:该进程正在运行,即进程正在占用 CPU, 任何时候都只有一个进程。
- 就绪态:进程已经具备执行的一切条件,正在等待分配 CPU 的处理时间片。
- 等待态:进程正在等待某些事件,当前不能分配时间片, 进程不能使用 CPU,若等待事件发生(等待的资源分配到)则可将其唤醒,变成就绪态
-- 进程在系统中是并发运行的
tip:并发和并行的区别:
3、进程的特点
- 动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
4、进程的资源分配
二、进程的相关函数
1、获取进程的进程号
-- 函数头文件
- #include <sys/types.h>
- #include <unistd.h>
-- 函数原型
- pid_t getpid(void);
-- 函数作用:
- 获取当前运行的进程的进程号
-- 函数返回值:
- 返回 进程的进程号
2、获取进程的父进程号
-- 函数的作用:
- 返回父进程号
- pid_t getppid(void);
3、创建进程函数
-- 函数头文件
- #include <sys/types.h>
- #include <unistd.h>
-- 函数原型
- pid_t fork(void);
-- 函数的作用:
- 当运行该函数时 会复制父进程所有资源
- 创建出来一个新的进程并从fork函数开始运行
- 父进程和子进程运行顺序随机 不确定
-- 函数的返回值:
- 在父进程中返回 子进程进程号
- 在子进程中返回 0
4、进程退出函数
-- 之前我们从主函数的return 0进行退出
如果我们想让进程从函数中退出可以调用以下函数来实现
-- 函数头文件
- #include <stdlib.h>
-- 函数原型
- void exit(int status);
-- 函数的作用:
- 正常退出进程 可以直接当作main函数中return0;与return 0的作用一样,如也可以清空缓冲区。
-- 函数的参数:
- status:status & 0xff 之后将值返回给父进程
5、进程退出函数
-- 函数头文件
- #include <unistd.h>
-- 函数原型
- void _exit(int status);
-- 函数的作用
- 退出进程函数 会立马关闭所有的文件描述符,不会调用注册的退出处理程序
-- 函数的参数:
- status:status & 0xff 之后将值返回给父进程
-- exit和_exit的区别
当你调用 exit 时,程序会做一些事情,比如:
- 调用所有注册的退出处理程序。
- 关闭所有打开的文件流。
- 刷新输出流。
而调用 _exit 时,程序会立即终止,不会执行上述清理操作。
5、注册退出函数
-- 函数头文件
- #include <stdlib.h>
-- 函数原型
- int atexit(void (*function)(void));
-- 函数的作用
- 注册一个函数 当进程正常死亡的时候会被调用
-- 函数的参数:
- void (*function)(void):函数指针 指向一个返回值为
- void 无参数的函数
-- 函数返回值:
- 成功 返回 0
- 失败 返回 非0
例:
-- 下面这个程序
fork()
fork()
fork()
printf(“hello world\n”);