1 环境表的由来
- 首先,我们从前文已经了解到启动例程将三个东西(argc,argv,envp)传给main函数。
int main(int argc,char *argv[] ,char* envp[])h
argc 是 参数的个数。
argv是 参数表。
envp是环境表。
2 环境表的格式
环境表:初始时,继承于父进程
extern char** environ;
其中包括有 :============
“HOME=/home/Kshine”
"PATH=/bin:/usr/bin"
"SHELL=/bin/bash"
"USER=Kshine"
"MAIL=/var/mail/kshine"
。。。。
。。。。
。。。。
。。。。
NULL
=====================
3 获取环境表的测试小代码
- 代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char **environ;//导入该变量
int main(int argc,char* argv[]){
int i=0;
char* ptr = environ[i];//指向第一个环境变量等式
while(ptr!=NULL){
printf("%s\n",ptr)
}
return 0;
}
- 运行结果:
kshine@kshine-virtual-machine:~/桌面$ vi test_environ.c
kshine@kshine-virtual-machine:~/桌面$ gcc test_environ.c -o te -Wall
kshine@kshine-virtual-machine:~/桌面$ ./te
SSH_AGENT_PID=2215
GPG_AGENT_INFO=/tmp/keyring-8rYgpt/gpg:0:1
TERM=xterm
SHELL=/bin/bash
...
...(此处省略)
...
DISPLAY=:0.0
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=ibus
LESSCLOSE=/usr/bin/lesspipe %s %s
COLORTERM=gnome-terminal
XAUTHORITY=/home/kshine/.Xauthority
OLDPWD=/home/kshine
_=./te
4 环境变量操作函数
- 头文件
#include <stdlib.h>
- 几个相关函数
(1)获取环境变量值
char *getenv(const char *name);
(2)放入“name = value”形式的字符串。(覆盖),成功返回0,失败返回-1
int putenv(char*str);
(3)设置具体的name的value。(rewrite决定是否覆盖),成功返回0,失败返回-1
int setenv(const char *name,const char * value,int rewrite);
(4)删除name的定义(无论是否存在),成功返回0,失败返回-1
int unsetenv(const char* name);
5 非局部跳转
在C程序中,做异常处理,需要用到跳转。
我们知道,在函数内部做跳转时(局部跳转),会使用 goto 。
如果要进行非局部跳转,则需要用到跳转函数longjmp。
- 头文件
#include <setjmp.h>
- 相关函数
(1) 设置非局部跳转的跳转点
int setjmp(jmp_buf env);
(2) 进行非局部跳转,val作为返回值
void longjmp(jmp_buf env,int val);
- 注意点
env参数:
(1)特殊类型jmp_buf。
(2)在调用longjmp时,存放用来恢复栈状态的所有信息。
longjmp 非局部跳转后:
(1)全局变量、静态变量、volatile易失变量 不能恢复到原始值。
(2)寄存器变量可以恢复到原始值。
(3)自动变量(auto)在优化编译后,可能会恢复到原始值。