c语言总是从main函数开始执行。
int main(int argc, char *argv[])
当内核执行C程序时(通过使用一个exec
),会先调用一个特殊的启动例程,作为程序的起始地址。启动例程将从内核取得命令行参数和环境变量值
每个程序都接收到一张环境表,全局变量environ
则包含了该指针数组的地址
打印环境变量
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i;
char **ptr;
extern char **environ;
for (i = 0; i < argc; i++) /* echo all command-line args */
printf("argv[%d]: %s\n", i, argv[i]);
for (ptr = environ; *ptr != 0; ptr++) /* and all env strings */
printf("%s\n", *ptr);
exit(0);
}
获取设置删除环境变量
#include <stdlib.h>
/*
* 功能:C 库函数 char *getenv(const char *name) 搜索 name 所指向的环境字符串,并返回相关的值给字符串。
* 参数: name -- 包含被请求变量名称的 C 字符串。
* 返回值:该函数返回一个以 null 结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NULL。
* 函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里,当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
*/
char *getenv(const char *name)
/*
* 函数说明:putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
* 返回值:执行成功则返回0,有错误发生则返回-1。
* 错误代码:ENOMEM 内存不足,无法配置新的环境变量空间。
* 作用域:只在本进程内有效
*/
int putenv(const char * string);
/*
* 函数说明 : setenv()用来改变或增加环境变量的内容。
* 参数: name为环境变量名称字符串。
* value则为变量内容。
* overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,则改变环境变量原有内容,原有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
* 作用域:只在本进程内有效
* 返回值 执行成功则返回0,有错误发生时返回-1。
*/
int setenv(const char *name,const char * value,int overwrite);
/*
* 作用:删除name的定义,即使不存在也不算出错
**/
int unsetenv(const char *name);
#include <stdio.h>
#include <stdlib.h>
int main ()
{
printf("PATH : %s\n", getenv("PATH"));
printf("HOME : %s\n", getenv("HOME"));
printf("ROOT : %s\n", getenv("ROOT"));
return(0);
}
#include<stdlib.h>
#include<stdio.h>
int main()
{
char *p;
if ((p = getenv("USER")))
printf("USER =%s\n",p);
putenv("USER=test");
printf("USER=%s\n",getenv("USER"));
return 0;
}
#include<stdlib.h>
#include <stdio.h>
main()
{
char * p;
if((p=getenv("USER")))
printf("USER =%s\n",p);
setenv("USER","test",1);
printf("USER=%s\n",getenv("USER"));
unsetenv("USER");
printf("USER=%s\n",getenv("USER"));
}