Linux Shell C语言代码功能增强咨询:系统命令执行与环境变量配置
给Shell子进程添加自定义环境变量的实现
要给执行系统命令的子进程添加parent=/linShell环境变量,只需在子进程分支中修改环境变量后再执行execv即可——因为exec系列函数会继承当前进程的环境变量。下面是修改后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <limits.h> // 用于PATH_MAX常量 void execute_command(char* command, int background) { pid_t pid = fork(); if (pid < 0) { perror("Fork failed"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程逻辑 if (background) { setsid(); // 启动新会话,脱离终端控制 } // 添加自定义环境变量:parent=/linShell // 如果要动态传递父Shell的实际工作目录,替换为下面的getcwd逻辑 // char cwd[PATH_MAX]; // if (getcwd(cwd, sizeof(cwd)) == NULL) { // perror("getcwd failed"); // exit(EXIT_FAILURE); // } // setenv("parent", cwd, 1); setenv("parent", "/linShell", 1); char* argv[] = { "/bin/sh", "-c", command, NULL }; execv(argv[0], argv); // 只有execv执行失败时才会走到这里 perror("Execv failed"); exit(EXIT_FAILURE); } else { // 父进程逻辑 if (!background) { waitpid(pid, NULL, 0); // 等待前台命令执行完成 } else { printf("后台命令PID:%d\n", pid); } } }
关键修改说明
- 使用
setenv函数添加环境变量:第三个参数设为1表示如果已有同名环境变量,直接覆盖;若不需要覆盖可设为0。 - 若需要传递父Shell的实际工作目录而非硬编码的
/linShell,可以注释掉硬编码的setenv,启用注释里的getcwd逻辑——getcwd会获取当前子进程(继承父Shell工作目录)的路径,再设置到环境变量中。 - 环境变量的修改必须放在
execv之前,因为execv会替换当前进程的内存空间,之后的代码不会被执行。
内容的提问来源于stack exchange,提问作者Azmir Sabir
相关产品推荐
相关产品推荐

