目录
进程的概念
定义
- 进程是一个程序的一次执行的过程,同时也是资源分配的最小单元
程序与进程的区别
- 程序是静态的,是一些指令的有序合集
- 进程是动态的,是程序的执行过程,包括动态创建、调度和消亡的整个进程。
- 进程是Linux系统的基本调度和管理资源的单位。
进程运行的状态
- 就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间。
- 执行态:该进程正在占用CPU运行。
- 等待态:进程因不具备某些执行条件而暂时无法继续执行的状态。
Linux进程管理
ps aux 命令
- PID:进程的ID
- %CPU:进程占用的CPU百分比
- %MEM:占用内存的百分比
- COMMAND:命令的名称和参数
- STAT:S 处于休眠状态,静止状态、R 正在运行、Z 僵尸进程不存在但暂时无法消除
top命令
- P:按%CPU排序
- M:按%MEM排序
- 空格:马上刷新(默认3秒)
- q:退出(默认的top会一直占用当前端口)
pgrep命令
-l:列出进程的名称
kill命令
kill -9 进程号
进程控制块
进程控制块(PCB)
- 系统根据PCB来对并发执行的进程进行控制和管理。
- 系统在创建一个进程的时候会开辟一段内存空间存放与此进程相关的PCB数据结构。
进程的标识
简介
- 每个进程都由一个进程号来标识,其类型为pid_t
- 进程号的范围:0~32767
- 进程号为0及1的进程由内核创建
- 进程号总是唯一的,但进程号可以重用
函数调用
- 进程号PID :getpid()
- 父进程:
任何进程(除init进程)都是由另一个进程创建
该进程称为被创建进程的父进程,对应的进程号称为父进程号
- 父进程号PPID:getppid()
- 需要包含头文件: #include <sys/types.h> 、#include <unistd.h>
创建进程
fork函数
功能描述:
- fork() 通过复制调用进程来创建一个新进程。
- 子进程的新进程是精确的调用过程的副本,称为父进程
以下几点除外:
- 子进程有自己唯一的进程号ID,而这个PID与任何现有进程组的ID都不匹配
- 子进程的父进程ID与父进程ID相同
返回值
- 成功:父进程中返回子进程的PID,子进程中返回0
- 失败:父进程返回-1
程序实例
#include<stdio.h> #include<unistd.h> int main() { pid_t pid; pid=fork(); if(pid>0)//parent 先执行父进程 printf("1\n"); if(pid==0)//son 再执行子进程 printf("2\n"); if(pid<0) printf("error\n"); printf("...\n"); return 0; }
实验现象
孤儿进程
孤儿进程:是没有父进程的进程,每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,孤儿进程结束了其生命周期。因此孤儿进程并不会危害。
僵尸进程
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。
- 僵尸进程的危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。
wait函数
函数原型:pid_t wait(int *status)//返回信息
函数功能:
等待子进程终止,如果子进程终止了,此函数会回收子进程的资源。
调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒。
若调用进程没有子进程或它的子进程已经结束,该函数立即返回。
函数返回值:
如果执行成功则返回子进程的进程号。
出错返回-1,失败原因存于errno中
函数参数:
函数返回时,参数status中包含子进程退出时的状态信息。子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。
取出子进程的退出信息WIFEXITED(status)
如果子进程是正常终止的,取出的字段值非零。
WEXITSTATUS(status) 返回子进程的退出状态,退出状态保存在status变量的8~16位。
在用此宏前应先用宏WIFEXITED判断子进程是否正常退出,正常退出才可以使用此宏。
注意:此status是个wait的参数指向的整型变量。
程序实例
终止进程
void exit(int value) void _exit(int value)
exit函数:#include <stdlib.h> void exit(int status)
_exit函数:#include <unistd.h> void _exit(int status)