- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
命今"参数和坏境变至耒初始化的壊拥由
命今"参数和坏境变至
耒初始化的壊拥
由 execii'KFULl'iO
第30章进程
2.环境变量
先前讲过,exec系统调用执行新程序时会把命令行参数和环境变量表传递给 main函数,它们在整个进程地址空间中的位置如下图所示。
图30.2.进程地址空间
咼地址
眯K从程庠文件中馈到
正文
正文
低地址
和命令行参数argv类似,环境变量表也是一组字符串,如下图所示 图30.3.环境变量
environ
—「^?{PATH = jLJ5r75bin:/Li£i7bin:j5bin:Iji|r^]
二*命 El2L 斗 biryb 侖i\0|
NULL
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文 件中,所以在使用时要用extern声明。例如: 例30.1.打印环境变量
[int main(void)
i
k
I
{
I
exter n char **e nvir on;
int i;
| for(i=0; en viro n[i]!=NULL;
i++)
] prin tf("%s\n",
1 en vir on [i]);
return 0;
!
i
}
执行结果为
1 $ ./a.out
I
I
\\
i SSH_AGENT_PID=5717
b — —
I
h
■j
[SHELL=/bin/bash
1 DESKTOP STARTUP ID=
I
H
TERM=xterm
由于父进程在调用fork创建子进程时会把自己的环境变量表也复制给子进程, 所以a.out打印的环境变量和Shell进程的环境变量是相同的。
按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字 母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变 量的值。环境变量定义了进程的运行环境,一些比较重要的环境变量的含义如下:
PATH
可执行文件的搜索路径。Is命令也是一个程序,执行它不需要提 供完整的路径名/bin/ls ,然而通常我们执行当前目录下的程序 a.out却需要提供完整的路径名./a.out ,这是因为PATH^境变量 的值里面包含了 Is命令所在的目录/bin,却不包含a.out所在的 目录。PATH环境变量的值可以包含多个目录,用:号隔开。在Shell 中用echo命令可以查看这个环境变量的值:
$ echo $PATH
/usr/local/sb in:/usr/local/b in:/usr /sb in:/usr/b in:/sb in:/b in:/usr/game s
SHELL
当前Shell,它的值通常是/bin/bash
TERM
当前终端类型,在图形界面终端下它的值通常是 xterm,终端类型
决定了一些程序的输出显示方式,比如图形界面终端可以显示汉 字,而字符终端一般不行。
LANG
语言和locale,决定了字符编码以及时间、货币等信息的显示格式。
HOME
当前用户主目录的路径,很多程序需要在主目录下保存配置文件, 使得每个用户在运行该程序时都有自己的一套配置。
用environ指针可以查看所有环境变量字符串,但是不够方便,如果给出 name
要在环境变量表中查找它对应的 value,可以用getenv函数。
i #include <stdlib.h>
i
丨 char *getenv(const char *name);
getenv的返回值是指向value的指针,若未找到则为NULL
修改环境变量可以用以下函数
I int setenv(const char *name, const char
J
f *value, int rewrite);
I
i void unsetenv(const char *name);
putenv和setenv函数若成功则返回为0,若出错则返回非0。
setenv将环境变量name的值设置为value。如果已存在环境变量name那么
.若rewrite非0,则覆盖原来的定义;
?若rewrite为0,则不覆盖原来的定义,也不返回错误。
unsetenv删除name的定义。即使name没有定义也不返回错误。
例30.2 .修改环境变量
#in clude <stdlib.h>
L
| #include <stdio.h>
int main( void)
I-
{
!
] prin tf("PATH=%s\n",
f getenv("PATH"));
sete nv("PATH", "hello",
]1);
] prin tf("PATH=%s\n",
[getenv("PATH"));
return 0;
!
!}
|
文档评论(0)