三步掌握WeChatMsg:永久保存你的微信聊天记忆
2026/5/31 14:18:31
exec族函数的核心作用是程序替换:在当前进程空间中,用新程序的代码段、数据段替换原有程序,新程序执行完毕后,进程直接退出(不会返回原程序)。通常与fork搭配使用(父进程创建子进程,子进程执行exec替换程序)。
exec族包含6个函数,核心差异在于参数传递方式和程序路径查找方式,规律如下:
l(list):参数逐个列出,以NULL结尾v(vector):参数存储在数组中,数组末尾以NULL结束p(path):程序名无需完整路径,依赖系统PATH环境变量查找e(env):自定义环境变量(本文重点讲解前4个常用函数)| 函数原型 | 特点 | 示例 |
|---|---|---|
execl(const char *path, const char *arg, ...) | 完整路径+参数列表 | execl("/usr/bin/ls", "ls", "-l", NULL) |
execlp(const char *file, const char *arg, ...) | 程序名(PATH查找)+参数列表 | execlp("ls", "ls", "-l", NULL) |
execv(const char *path, char *const argv[]) | 完整路径+参数数组 | char *argv[] = {"ls", "-l", NULL}; execv("/usr/bin/ls", argv) |
execvp(const char *file, char *const argv[]) | 程序名(PATH查找)+参数数组 | char *argv[] = {"ls", "-l", NULL}; execvp("ls", argv) |
#include>#include.h>intmain(){// 执行firefox,打开谷歌浏览器(完整路径)execl("/usr/bin/firefox","firefox","https://www.google.com",NULL);perror("execl");// 若执行到此处,说明execl失败return0;}/usr/bin/firefox)NULL结尾execl执行成功,不会返回原程序,perror不会执行#include>#include.h>intmain(intargc,char*argv[]){// 无需完整路径,依赖PATH环境变量查找firefoxexeclp("firefox","firefox","www.baidu.com",NULL);printf("看见就错了\n");// 执行到此处说明execlp失败return0;}#includeintmain(intargc,char*argv[]){// 执行自定义程序aaa,传递参数11、22、33、4execl("/home/linux/20251215/aaa","aaa","11","22","33","4",NULL);printf("看见就错了\n");// 执行失败时输出return0;}gcc 2.c -o aaa),第一个参数为程序完整路径#include>#include>intmain(intargc,char*argv[]){char*argv[]={"ls","-al","/bin","--color",NULL};// 程序名+参数数组,PATH查找lsexecvp("ls",argv);perror("execvp");return0;}#include>intsystem(constchar*command);fork+exec+waitpidcd),仅适用于信息输出、文件操作等无状态命令#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){system("ps aux");// 执行进程查看命令system("cd /home/linux");// 此命令不影响父进程工作路径printf("aaa\n");return0;}system("cd /home/linux")仅在子进程中切换路径,父进程路径不变#include.h>char*getcwd(char*buf,size_tsize);buf:存储路径的字符数组size:数组最大长度(建议预留1字节给结束符\0)buf指针,失败返回NULL#includeintchdir(constchar*path);path为目标路径(绝对路径或相对路径)#include<stdio.h>#include<unistd.h>intmain(){charpath[1024]={0};// 获取初始工作路径getcwd(path,sizeof(path)-1);printf("path is %s\n",path);// 输出:path is /home/linux/20251215// 切换到上级目录chdir("../");getcwd(path,sizeof(path)-1);printf("path is %s\n",path);// 输出:path is /home/linux// 在新路径下创建文件FILE*fp=fopen("aaa","w");// 文件创建在/home/linux目录下return0;}