c - unsetenv() 实现,是否需要释放内存?
c - unsetenv() implementation, is it necessary to free memory?
根据 TLPI exercise 6-3
的要求,我使用 putenv()
、getenv()
并通过修改 environ
变量实现了 setenv()
和 unsetenv()
直接。
代码:
// setenv() / unsetenv() impl
// TLPI exercise 6-3
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define ENV_SEP '='
extern char **environ;
// setenv() impl using putenv() & getenv()
int setenv_impl(const char * name , const char * value , int overwrite ) {
if(!overwrite && getenv(name)) { // exists & don't overwrite
return 0;
} else {
// construct the new variable
char *env_var = malloc(strlen(name) + strlen(value) + 2);
strcpy(env_var, name);
env_var[strlen(name)] = ENV_SEP;
strcpy(env_var+(strlen(name)+1), value);
int result = putenv(env_var);
if(result==0) {
return 0;
} else {
errno = result;
return -1;
}
}
}
// unsetenv() impl via modifing environ directly,
int unsetenv_impl(const char * name ) {
char **ep, **sp;
size_t len;
len = strlen(name);
for(ep = environ; *ep != NULL;) {
if(strncmp(*ep, name, len)==0 && (*ep)[len] == ENV_SEP) {
// shift all successive elements back 1 step,
for(sp=ep; *sp != NULL; sp++) {
*sp = *(sp+1);
}
} else {
ep++;
}
}
return 0;
}
// setenv_impl() test
int setenv_impl_test() {
char *key = "name";
setenv_impl(key,"Eric", 1);
printf("%s\n", getenv(key));
setenv_impl(key,"Eric2", 0);
printf("%s\n", getenv(key));
setenv_impl(key,"Eric3", 1);
printf("%s\n", getenv(key));
return 0;
}
// unsetenv_impl() test
int unsetenv_impl_test() {
char *key = "name";
setenv_impl(key,"Eric", 1);
printf("%s\n", getenv(key));
unsetenv_impl(key);
char *val = getenv(key);
printf("%s\n", val==NULL?"NULL":getenv(key));
return 0;
}
int main(int argc, void *argv[]) {
// setenv_impl_test();
unsetenv_impl_test();
return 0;
}
在我的 setevn_impl()
中,我使用 malloc()
为新环境变量分配内存。
但是不知道进程默认环境的内存是怎么分配的
我的问题是:
在我的unsetenv_impl()
实现中,是否有必要/适当地通过free()
释放已删除环境字符串的内存?
如果我不释放它会不会有问题,或者它不会占用太多内存因此可以忽略?
提示:
putenv()
不会复制字符串,它只是让全局变量 environ
指向传递给它的字符串。
在您的情况下,如果您不打算非常频繁地设置环境变量导致内存资源耗尽,则没有必要。
但是,如果您总是在使用完资源后释放资源,那就太好了,无论是文件 handles/memory/mutexs。通过这样做,您在构建服务器时就不会犯那种错误。
有些服务器预计 运行 24x7。在这些情况下,任何形式的任何泄漏都意味着您的服务器最终将 运行 超出该资源并以某种方式 hang/crash 。一个简短的实用程序,你的泄漏还不错。任何服务器,任何泄漏都是死亡。帮自己一个忙。自己清理干净。这是个好习惯
根据 TLPI exercise 6-3
的要求,我使用 putenv()
、getenv()
并通过修改 environ
变量实现了 setenv()
和 unsetenv()
直接。
代码:
// setenv() / unsetenv() impl
// TLPI exercise 6-3
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#define ENV_SEP '='
extern char **environ;
// setenv() impl using putenv() & getenv()
int setenv_impl(const char * name , const char * value , int overwrite ) {
if(!overwrite && getenv(name)) { // exists & don't overwrite
return 0;
} else {
// construct the new variable
char *env_var = malloc(strlen(name) + strlen(value) + 2);
strcpy(env_var, name);
env_var[strlen(name)] = ENV_SEP;
strcpy(env_var+(strlen(name)+1), value);
int result = putenv(env_var);
if(result==0) {
return 0;
} else {
errno = result;
return -1;
}
}
}
// unsetenv() impl via modifing environ directly,
int unsetenv_impl(const char * name ) {
char **ep, **sp;
size_t len;
len = strlen(name);
for(ep = environ; *ep != NULL;) {
if(strncmp(*ep, name, len)==0 && (*ep)[len] == ENV_SEP) {
// shift all successive elements back 1 step,
for(sp=ep; *sp != NULL; sp++) {
*sp = *(sp+1);
}
} else {
ep++;
}
}
return 0;
}
// setenv_impl() test
int setenv_impl_test() {
char *key = "name";
setenv_impl(key,"Eric", 1);
printf("%s\n", getenv(key));
setenv_impl(key,"Eric2", 0);
printf("%s\n", getenv(key));
setenv_impl(key,"Eric3", 1);
printf("%s\n", getenv(key));
return 0;
}
// unsetenv_impl() test
int unsetenv_impl_test() {
char *key = "name";
setenv_impl(key,"Eric", 1);
printf("%s\n", getenv(key));
unsetenv_impl(key);
char *val = getenv(key);
printf("%s\n", val==NULL?"NULL":getenv(key));
return 0;
}
int main(int argc, void *argv[]) {
// setenv_impl_test();
unsetenv_impl_test();
return 0;
}
在我的 setevn_impl()
中,我使用 malloc()
为新环境变量分配内存。
但是不知道进程默认环境的内存是怎么分配的
我的问题是:
在我的
unsetenv_impl()
实现中,是否有必要/适当地通过free()
释放已删除环境字符串的内存?如果我不释放它会不会有问题,或者它不会占用太多内存因此可以忽略?
提示:
putenv()
不会复制字符串,它只是让全局变量 environ
指向传递给它的字符串。
在您的情况下,如果您不打算非常频繁地设置环境变量导致内存资源耗尽,则没有必要。
但是,如果您总是在使用完资源后释放资源,那就太好了,无论是文件 handles/memory/mutexs。通过这样做,您在构建服务器时就不会犯那种错误。
有些服务器预计 运行 24x7。在这些情况下,任何形式的任何泄漏都意味着您的服务器最终将 运行 超出该资源并以某种方式 hang/crash 。一个简短的实用程序,你的泄漏还不错。任何服务器,任何泄漏都是死亡。帮自己一个忙。自己清理干净。这是个好习惯