#Linux中的GCC编程# 环境变量和非局部跳转

1 环境表的由来

  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 获取环境表的测试小代码

  1. 代码如下:
#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;
}

  1. 运行结果:
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 环境变量操作函数

  1. 头文件
#include <stdlib.h>
  1. 几个相关函数
(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

  1. 头文件
#include <setjmp.h>
  1. 相关函数
(1) 设置非局部跳转的跳转点
int setjmp(jmp_buf env);

(2) 进行非局部跳转,val作为返回值
void longjmp(jmp_buf env,int val);
  1. 注意点
    env参数:
    (1)特殊类型jmp_buf。
    (2)在调用longjmp时,存放用来恢复栈状态的所有信息。
    longjmp 非局部跳转后:
    (1)全局变量、静态变量、volatile易失变量 不能恢复到原始值。
    (2)寄存器变量可以恢复到原始值。
    (3)自动变量(auto)在优化编译后,可能会恢复到原始值。

猜你喜欢

转载自blog.csdn.net/Kshine2017/article/details/103885567