策略模式实战:隐藏复杂逻辑的设计模式核心解析
2026/9/5 6:40:07
exec 族函数的核心作用是替换当前进程的代码段、数据段和堆栈段,执行系统上的任意一个可执行文件(二进制程序或脚本)。执行后,原进程的代码会被新程序完全替换,新程序从main函数开始执行;若 exec 函数执行成功,原进程后续的代码不会再执行,只有新程序执行结束,整个进程才会终止。
通常 exec 族函数会与fork()搭配使用:父进程通过 fork 创建子进程,子进程调用 exec 执行新程序,父进程则负责等待子进程结束(如使用wait()/waitpid()),这样既保留了父进程,又能让子进程执行新任务。
exec 族函数的命名后缀(l/v/p)有明确含义,是理解其用法的关键:
NULL作为结束标志。NULL。PATH指定的路径中查找该文件;若无p后缀,则需要传入完整路径 + 文件名。#include <unistd.h> int execl(const char *path, const char *arg, ...);path:待执行程序的完整路径 + 文件名(如/bin/ls)。arg:新程序的参数列表,第一个参数通常是程序名本身,后续为具体参数,最后以NULL结束。-1(并设置errno)。#include <unistd.h> int execlp(const char *file, const char *arg, ...);file:待执行程序的文件名(如ls),函数会在PATH环境变量中查找该文件。arg:参数列表,规则同execl,以NULL结束。-1。#include <unistd.h> int execv(const char *path, char *const argv[]);path:待执行程序的完整路径 + 文件名。argv:存储参数的字符串数组,数组第一个元素为程序名,最后一个元素为NULL。-1。#include <unistd.h> int execvp(const char *file, char *const argv[]);file:待执行程序的文件名,依赖PATH环境变量查找。argv:参数数组,规则同execv,最后以NULL结束。-1。若需要调用自定义的可执行程序,无论使用上述哪个 exec 函数,只要将第一个参数(path/file)填写为完整路径 + 文件名,都可以成功调用(无需依赖PATH环境变量)。
system函数用于执行一个 shell 命令,其内部实现依赖fork()+exec()+waitpid():先创建子进程,子进程调用 exec 执行 shell 命令,父进程等待子进程结束。
注意:system执行的 shell 命令不能是修改父进程状态的命令(如cd,因为子进程的环境修改不会影响父进程),通常用于执行信息输出(如ls)、文件操作(如rm/cp)等无状态修改的命令。
#include <stdlib.h> int system(const char *command);command:需要执行的 shell 命令字符串(如"ls -l"、"rm test.txt")。fork()失败或waitpid()出错,返回-1;exec()失败(如命令不存在),返回值对应 shell 执行失败的状态;#include <unistd.h> char *getcwd(char *buf, size_t size);buf:用于存储路径的字符数组。size:字符数组buf的最大长度(需足够容纳路径字符串 + 结束符\0)。buf的指针;NULL(并设置errno,如buf空间不足)。#include <unistd.h> int chdir(const char *path);path指定的路径。path:需要切换的目标路径(可使用绝对路径或相对路径)。0;-1(并设置errno,如路径不存在)。chdir仅修改当前进程的工作路径,若在子进程中调用chdir,不会影响父进程的工作路径(进程间环境相互独立)。