III. Linx系统编程_ 30进程_2 环境变量.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
III. Linx系统编程_ 30进程_2 环境变量

第?30?章?进程 2.?环境变量 先前讲过,exec系统调用执行新程序时会把命令行参数和环境变量表传递给main函数,它们在整个进程地址空间中的位置如下图所示。 图?30.2.?进程地址空间 和命令行参数argv类似,环境变量表也是一组字符串,如下图所示。 图?30.3.?环境变量 libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。例如: 例?30.1.?打印环境变量 #include int main void extern char **environ; int i; for i 0; environ[i]! NULL; i++ printf %s\n, environ[i] ; return 0; 执行结果为 $ ./a.out SSH_AGENT_PID 5717 SHELL /bin/bash DESKTOP_STARTUP_ID TERM xterm ... 由于父进程在调用fork创建子进程时会把自己的环境变量表也复制给子进程,所以a.out打印的环境变量和Shell进程的环境变量是相同的。 按照惯例,环境变量字符串都是name value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。环境变量定义了进程的运行环境,一些比较重要的环境变量的含义如下: PATH 可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。PATH环境变量的值可以包含多个目录,用:号隔开。在Shell中用echo命令可以查看这个环境变量的值: $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games SHELL 当前Shell,它的值通常是/bin/bash。 TERM 当前终端类型,在图形界面终端下它的值通常是xterm,终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。 LANG 语言和locale,决定了字符编码以及时间、货币等信息的显示格式。 HOME 当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。 用environ指针可以查看所有环境变量字符串,但是不够方便,如果给出name要在环境变量表中查找它对应的value,可以用getenv函数。 #include char *getenv const char *name ; getenv的返回值是指向value的指针,若未找到则为NULL。 修改环境变量可以用以下函数 #include int setenv const char *name, const char *value, int rewrite ; void unsetenv const char *name ; putenv和setenv函数若成功则返回为0,若出错则返回非0。 setenv将环境变量name的值设置为value。如果已存在环境变量name,那么 若rewrite非0,则覆盖原来的定义; 若rewrite为0,则不覆盖原来的定义,也不返回错误。 unsetenv删除name的定义。即使name没有定义也不返回错误。 例?30.2.?修改环境变量 #include #include int main void printf PATH %s\n, getenv PATH ; setenv PATH, hello, 1 ; printf PATH %s\n, getenv PATH ; return 0; $ ./a.out PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PATH hello $ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 可以看出,Shell进程的环境变量PATH传给了a.out,然后a.out修改了PATH的值,在a.out中能打印出修改后的值,但在Shell进程中PATH的值没变。父进程在创建子进程时会复制一份环境变量给子进程,但此后二者的环境变量互不影响。

文档评论(0)

bguarfan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档