进程
组成
进程一般由三个部分组成,分别是进程控制块、代码段、数据段。代码段指的是进程中能被调度程序调度到CPU上执行的程序代码段,数据段指的是进程对应的程序原始数据或者程序执行过程中产生的中间数据等。
不同操作系统对于一个进程的信息记录是不同的,也就是PCB中的内容会有一些区别,但是大同小异,基本都会包含以下内容:
- 进程标识符
每个进程都有一个有系统分配的唯一的PID进程标识符(process identifier),用于区分系统中的其他进程,这个PID也是Linux内核提供给用户访问进程的一个接口,用户可以通过PID控制进程。
可以使用ps -aux ps -ef查看进程 - 进程当前状态
一个运行中的进程至少可划分为5种基本状态:就绪态、运行态、阻塞态、创建态、结束态
注意:如果该进程退出之后资源还没有释放,但是此时进程已经无法被调度和运行,进程就会进入僵尸态,需要对这类进程进行处理,避免占用过多资源,导致程序被kill
进程创建
Linux系统中的一个进程中可以创建若干个新进程,新创建的进程中又可以创建子进程。
Linux系统中的所有进程都和一个进程有关系,那就是systemd进程,该进程是Linux系统运行的第一个进程,英文全称是system daemon,中文翻译为系统守护进程,系统中其他进程都是该进程的子进程。负责在系统启动或运行时激活系统资源,并且管理服务器进程和其它进程。
//头文件
#include <unistd.h>
pid_t fork(void);//此函数可以复制父进程的代码段和数据段给子进程
//fork函数在父进程中返回的是创建成功的子进程的PID,fork函数在子进程中的返回值是0,如果子进程失败则返回-1。
getpid函数
此函数可以获得当前进程的PID
//头文件
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);
getppid函数
此函数可以获取当前进程的父进程PID
//头文件
#include <sys/types.h>
#include <unistd.h>
pid_t getppid(void);
撤销进程
wait函数
一个进程在完成自身任务之后应该及时撤销,这样就可以及时的释放进程的资源,此时可以分为两种情况:一种是撤销指定进程,另一种是撤销指定进程以及该进程的所有子孙进程。
Linux系统中提供了一个wait()函数,该函数用于让父进程等待子进程的状态改变并获取已经改变状态的子进程的信息
//头文件
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
//wait函数的参数是一个指针,用于记录子进程的退出状态,如果该参数为NULL,则表示当前进程放弃子进程的退出状态。对于该指针中记录的值,可以通过系统提供的宏定义来分析子进程的退出状态。
注意:如果当前进程没有子进程,则wait函数立即返回,如果当前进程有很多个子进程则wait函数会回收第一个变为僵尸态的子进程资源。
waitpod函数
waitpid()函数也可以等待子进程状态改变并回收子进程的系统资源,只不过该函数可以指定回收某个子进程的系统资源。
//头文件
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid | 作用 | options | 作用 |
---|---|---|---|
<-1 | 等待组ID等于pid绝对值的进程组中的一个子进程 | 0 | 阻塞等待子进程的退出 |
-1 | 等待任意一个子进程 | WHOHANG | 若没有僵尸子进程,则函数立即返回 |
0 | 等待本进程所在进程组中的任何一个子进程 | WUNTRACED | 当子进程暂停时函数返回 |
>0 | 等待指定pid的子进程 | WCONTINUED | 当子进程收到信号SIGCONT继续运行时函数返回 |
进程执行
在子进程中执行别的程序而不执行其父进程
exec()函数族可以把当前进程映像替换为新的进程映像
//头文件
#include <unistd.h>
int execl(const char *path, const char *arg, ...
/* (char *) NULL */);
//path:要执行的文件路径
//参数列表必须以NULL结束
- l:以列表的方式来组织指定程序的参数
- v: 以数组的方式来组织指定程序的参数
- e: 执行指定程序前顺便设置环境变量
- p: 执行程序时可自动搜索环境变量PATH的路径
system函数
//头文件
#include <stdlib.h>
int system(const char *command);
//command:是一个指向以空字符结尾的字符串的指针,该字符串包含要执行的系统命令
//ret:如果成功执行命令,返回值是命令的退出状态。如果无法执行命令(例如命令不存在),返回值为-1。