我如何释放使用 malloc befor exec 分配的环境
how do I free environ that allocated using malloc befor exec
我正在编写一个 shell 来模仿真实 shell 的一些基本功能,并且我正在尝试在我的 shell 中添加 environ 以便 child 进程可以继承 parent 环境的副本。
int Execute(char *argList[]) {
int pid;
int wstatus;
int ret;
pid = fork();
if (!pid) {
environ = VTable2Environ();
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
execvp(argList[0], argList);
perror("execvp");
exit(1);
} else if (pid != -1) {
ret = wait(&wstatus);
if (ret == -1) {
perror("wait");
return -1;
} else {
return wstatus;
}
} else {
perror("fork");
return -1;
}
}
function VTable2Environ()
returns a char **environ
,使用malloc分配,从进程变量table.
复制全局变量
char **VTable2Environ(){
char **env = malloc(sizeof(Variable) * (varTableSize + 1));
if(!env)return NULL;
int i, j;
for(i = 0, j = 0; i < varTableSize; ++i){
if(varTable[i].scope == GLOBAL){
env[j++] = varTable[i].str;
}
}
env[j] = NULL;
return env;
}
我想根据 execve(2)
避免内存 leak.And
execve() does not return on success, and the text, data, bss, and
stack of the calling process are overwritten by that of the program
loaded.
似乎 environ
没有被 execve()
覆盖。那我需要释放它吗?如果可以,怎么做?
不需要free
任何东西。如果 exec*
成功,则不需要释放内存,如果失败,则 运行 是 子进程 中的 exit(1)
首先分配内存,不需要释放内存。
还有就是不需要修改原有的环境! execvpe
函数接受第三个参数,即 char **environ
;您可以使用它来传递另一个环境。作为奖励,您的 PATH 可以与已执行进程的 PATH 不同。
因此你可以这样写
char **newEnv = VTable2Environ();
execvpe(argList[0], argList, newEnv);
我正在编写一个 shell 来模仿真实 shell 的一些基本功能,并且我正在尝试在我的 shell 中添加 environ 以便 child 进程可以继承 parent 环境的副本。
int Execute(char *argList[]) {
int pid;
int wstatus;
int ret;
pid = fork();
if (!pid) {
environ = VTable2Environ();
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
execvp(argList[0], argList);
perror("execvp");
exit(1);
} else if (pid != -1) {
ret = wait(&wstatus);
if (ret == -1) {
perror("wait");
return -1;
} else {
return wstatus;
}
} else {
perror("fork");
return -1;
}
}
function VTable2Environ()
returns a char **environ
,使用malloc分配,从进程变量table.
char **VTable2Environ(){
char **env = malloc(sizeof(Variable) * (varTableSize + 1));
if(!env)return NULL;
int i, j;
for(i = 0, j = 0; i < varTableSize; ++i){
if(varTable[i].scope == GLOBAL){
env[j++] = varTable[i].str;
}
}
env[j] = NULL;
return env;
}
我想根据 execve(2)
避免内存 leak.Andexecve() does not return on success, and the text, data, bss, and stack of the calling process are overwritten by that of the program loaded.
似乎 environ
没有被 execve()
覆盖。那我需要释放它吗?如果可以,怎么做?
不需要free
任何东西。如果 exec*
成功,则不需要释放内存,如果失败,则 运行 是 子进程 中的 exit(1)
首先分配内存,不需要释放内存。
还有就是不需要修改原有的环境! execvpe
函数接受第三个参数,即 char **environ
;您可以使用它来传递另一个环境。作为奖励,您的 PATH 可以与已执行进程的 PATH 不同。
因此你可以这样写
char **newEnv = VTable2Environ();
execvpe(argList[0], argList, newEnv);