在Linux C应用编程中,进程管理是核心的功能之一。
以fork()接口创建进程为基础,还包含exec、wait、exit、abort以及获取信息的getuid、getpid等接口,共同实现进程的创建、管理、通信等功能。
对于进程管理接口,将在本节进行详细说明。
进程管理接口
对于Linux C进程管理接口,定义在<unistd.h>、<sys/types.h>、<sys/wait.h>、<stdlib.h>等头文件中,主要包含进程相关的进程,以及exec系列进程。
对于进程管理相关接口,具体如下所示。
| |
|---|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| 注册一个退出函数,在应用结束或者exit调用时执行 |
| |
|---|
| |
| |
| |
| |
| 以列表形式加载新程序,继承当前环境,在PATH中查找 |
| 以数组形式加载新程序,继承当前环境,在PATH中查找 |
对于上述接口,其中常用的接口详细描述如下所示。
// fork 创建子进程// @return: 子进程ID,失败返回-1pid_tfork(void);// 注册一个退出函数,在应用结束或者exit调用时执行// @func: 退出函数// @return: 0表示成功,负值表示失败intatexit(void (*func)(void));// 获得当前进程的pid值// @return: 进程得pid__pid_tgetpid(void);// execl 以列表形式加载新程序,继承当前环境,指定完整路径// @path: 新程序路径// @arg0: 新程序参数0// @...: 新程序参数1、2、...// @return: 0表示成功,-1表示失败intexecl(constchar *path, constchar *arg0, ..., (char *)NULL);// execv 以数组形式加载新程序,继承当前环境,指定完整路径// @path: 新程序路径// @argv: 新程序参数数组// @return: 0表示成功,-1表示失败intexecv(constchar *path, char *const argv[]);
其中fork函数是进程管理的基础,在执行后会复制当前进程的所有资源,包括内存、文件描述符、信号量等,并进行两次返回。其中在子进程中返回0,在父进程中返回子进程的pid值;这样就可以根据返回值的不同,进行父进程和子进程的处理。
注意:对于fork前的执行的代码,需要确认未存在于系统缓冲区中(如printf需要换行或者通过fflush()刷新缓冲区),否则会同步被复制,执行多次。
而exec函数族主要功能是替换当前进程的程序,加载并执行新的可执行文件。执行成功后,原进程的资源和处理则被替换,不会返回。失败时才会返回并设置errno,可以进行相应处理。
进程管理应用示例
系统进程相关接口的应用主要就是创建子进程、获取进程ID、添加处理等功能,具体应用示例如下所示。
#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/wait.h>#include<unistd.h>voidfunc_exit(void){printf("===func_exit, 子进程退出\n");}intmain(int argc, char *argv[]){// 创建子进程pid_t pid = fork();if (pid == 0) {// 子进程注册退出函数 atexit(func_exit);printf("===子进程0, 进程ID:%d, 父进程ID:%d\n", getpid(), getppid());printf("===子进程0, uid:%d, gid:%d\n", getuid(), getgid());exit(1); } pid = fork();if (pid == 0) {// 子进程执行ls命令printf("===子进程1, ls 命令执行\n"); execl("/bin/ls", "ls", NULL);printf("===子进程1, 执行ls命令失败\n"); }printf("===父进程, 进程ID:%d\n", getpid());printf("===父进程, uid:%d, gid:%d\n", getuid(), getgid());// 等待子进程结束, 并获取子进程退出状态int status; wait(&status);printf("子进程退出,退出状态:%d\n", WEXITSTATUS(status)); wait(&status);printf("子进程退出,退出状态:%d\n", WEXITSTATUS(status)); return0;}
对于上述代码,具体执行结果如下所示。

总结
Linux C进程管理接口通过fork、wait以及exec族等核心函数,提供了完整的进程创建、执行、等待和退出机制。这些接口是Linux平台多进程应用的基础,同时也是理解进程管理的关键。
在使用多进程服务时,需要注意使用方法,避免造成僵尸进程(子进程已退出,但父进程尚未调用 wait)和孤儿进程(父进程已退出,但子进程尚未退出)。学会合理使用这些接口,也是构建并发任务处理的基础,值得深入学习掌握。