当前位置:首页>Linux>Linux C进程管理接口,进程创建和处理

Linux C进程管理接口,进程创建和处理

  • 2026-10-11 08:20:59
Linux C进程管理接口,进程创建和处理

在Linux C应用编程中,进程管理是核心的功能之一。

以fork()接口创建进程为基础,还包含exec、wait、exit、abort以及获取信息的getuid、getpid等接口,共同实现进程的创建、管理、通信等功能。

对于进程管理接口,将在本节进行详细说明。

进程管理接口

对于Linux C进程管理接口,定义在<unistd.h>、<sys/types.h>、<sys/wait.h>、<stdlib.h>等头文件中,主要包含进程相关的进程,以及exec系列进程。

对于进程管理相关接口,具体如下所示。

  • 进程创建和处理接口
函数
描述
fork
创建子进程
abort
异常退出进程
getuid
获取用户进程ID
getgid
获取组进程ID
getpid
获取当前进程ID
getppid
获取父进程ID
wait
等待子进程结束,回收子进程资源
exit
中止进程,传递退出状态
abort
异常退出进程
atexit
注册一个退出函数,在应用结束或者exit调用时执行
  • exec相关接口
函数
描述
execl
以列表形式加载新程序,继承当前环境,指定完整路径
execv
以数组形式加载新程序,继承当前环境,指定完整路径
execle
以列表形式加载新程序,自定义环境,指定完整路径
execve
以列表形式加载新程序,自定义环境,指定完整路径
execlp
以列表形式加载新程序,继承当前环境,在PATH中查找
execvp
以数组形式加载新程序,继承当前环境,在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)和孤儿进程(父进程已退出,但子进程尚未退出)。学会合理使用这些接口,也是构建并发任务处理的基础,值得深入学习掌握。

最新文章

随机文章