当前位置: 首页 > news >正文

exec() 族函数使用

exec() 族函数的核心作用是:替换当前进程的代码段、数据段等内存空间,以新的程序完全替代当前进程的运行内容

函数名

参数列表形式

是否使用 PATH

环境变量

execl

List(列表)

继承当前环境

execlp

List(列表)

继承当前环境

execle

List(列表)

需自行指定

execv

Vector(数组)

继承当前环境

execvp

Vector(数组)

继承当前环境

execvpe

Vector(数组)

需自行指定

List (l): 将命令行参数作为一个个独立的字符指针传入,最后必须以 NULL 结尾。所以所有用到列表作为传入参数方式的函数在exec后都会有个l

execl("/bin/ls", "ls", "-l", "-a", NULL);

Vector (v): 将命令行参数放入一个字符指针数组中,该数组必须以 NULL 结尾。所以所有用到列表作为传入参数方式的函数在exec后都会有个v

char *argv[] = {"ls", "-l", "-a", NULL};
execv("/bin/ls", argv);

Path (p): 函数名带 p(如 execlp, execvp)表示系统会在 PATH 环境变量(比如/usr/bin目录下)指定的目录列表中自动搜索名为 file 的可执行文件。不带 p 则必须提供完整路径。函数名带 e(如 execle, execvpe)允许用户自行指定环境变量,通过一个 char *envp[] 数组传递,该数组也必须以 NULL 结尾。不带 e 则新进程继承当前进程的所有环境变量

// 系统会自动在PATH中查找"ls"
execlp("ls", "ls", "-l", "-a", NULL);
// 需要提供完整路径
execl("/bin/ls", "ls", "-l", "-a", NULL);

比如利用exec函数简单实现一个shell的功能

程序会读取用户输入指令,通过创建的子进程执行execvp函数,去执行一个新程序即我输入的指令。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>#define MAX_ARGS 20int main() {char input[100];char *args[MAX_ARGS];char *token;int i;pid_t pid;int status;while (1) {// 1. 打印提示符,等待用户输入printf("jie shell> ");if (fgets(input, sizeof(input), stdin) == NULL) {break; // 处理 EOF (Ctrl+D)}// 2. 解析输入(简易解析)i = 0;token = strtok(input, " \t\n"); // 用空格、制表符、换行符分割输入while (token != NULL && i < MAX_ARGS - 1) {args[i++] = token;token = strtok(NULL, " \t\n");}args[i] = NULL; // 参数数组必须以NULL结尾if (args[0] == NULL) {continue; // 用户直接回车,继续循环}// 3. 创建子进程pid = fork();if (pid < 0) {perror("fork failed");continue;} else if (pid == 0) {// 4. 子进程:调用 execvp 尝试执行命令execvp(args[0], args);// 如果 execvp 成功,永远不会执行到这里perror("execvp failed"); // 只有失败才会执行exit(EXIT_FAILURE);       // 子进程异常退出} else {// 5. 父进程(Shell):等待子进程结束waitpid(pid, &status, 0);// 可以在这里检查子进程的退出状态if (WIFEXITED(status)) {printf("Command exited with status %d\n", WEXITSTATUS(status));}}}return 0;
}

输入不同命令得到结果:

http://www.dtcms.com/a/618350.html

相关文章:

  • 小程序公众号网站建设网站建设费用怎么入账
  • 基于MATLAB的滑膜观测器仿真搭建
  • 学生评教|高校评教|基于SpringBoot+vue高校学生评教系统 (源码+数据库+文档)
  • 深圳网站开发外包网站登录系统源码
  • wordpress acg站一个网站的建设需要哪些流程图
  • 40.华为云企业网站上云部署核心服务功能与用法总结
  • 推荐微商城网站建设河北邯郸大风
  • 中间件设计规范及安装手册
  • 网站开发合同预期中国百强城市榜单发布2021
  • Vgent:基于图的多模态检索推理增强生成框架GraphRAG,突破长视频理解瓶颈
  • MATLAB基于RBF神经网络与DE-NSGAII算法的钢轨闪光焊工艺参数优化
  • Vue3 watch 家族:watch、watchEffect、watchPostEffect 全梳理
  • 仿RabbitMQ实现消息队列(四)--sqlite3与gtest快速上手
  • 昆明网站建设_云南网站建设有网址的公司
  • 做网站后面维护要收钱吗如何做品牌运营与推广
  • 网络安全 | 深入解析CSRF攻击与防御实战
  • 动态网站发布部署核心问题详解
  • 基于RTT调试接口的项目适配性的lib库化实现与工程应用
  • 解决Blender新加面后不跟随骨骼移动(骨骼权重的绘制)
  • 深圳光明网站建设今天福州发生的重大新闻
  • Android 自定义「阶段进度条(步轴)」实践
  • 【第三阶段-核心功能开发:UI进阶】第七章:主题系统-就像室内设计师
  • discuz 手机网站wordpress 搜索自定义数据表字段
  • CC++链接数据库(MySQL)超级详细指南
  • 苍穹外卖 —— 数据统计和使用Apache_POI库导出Excel报表
  • 昆明好的网站制作网站价格评估 优帮云
  • 如何查询SQL Server数据库服务器的IP地址
  • 开源:开源协议从入门到落地
  • 网站域名要怎样规划佛山做外贸网站案例
  • 网站建设找导师蓝林月租网站空间