19.1 环境表

19.1.1 介绍

  这是启动例程的第二各作用,搜集环境表,然后传递给主函数。

  环境表就是一个指针数组。

                              环境表

  

  • 每个进程都有一个独立的环境表
  • 初始的环境表继承自父进程
  • 主函数可以带三个参数,第三个参数则是环境表,可以通过第三个参数获取环境参数,也可以通过外部全局变量来定义环境表,extern char **environ。
  • 设置的环境变量只影响当前进程的,不为全局的

19.1.2 例子

(1)通过 main 函数获取

 #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h> int main(int argc, char *argv[], char *envp[])
{
int i = ;
char *env;
while((env = envp[i]) != NULL) {
printf("%s\n", env);
i++;
} return ;
}

  

(2)通过全局变量

 #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h> extern char **environ; void show_env()
{
int i = ;
char *env;
while((env = environ[i]) != NULL){
printf("%s\n", env);
i++;
}
} int main(void)
{
show_env();
return ;
}

19.2 环境变量操作函数

  头文件都为 stdlib.h

19.2.1 获取环境变量内容--- getenv

 #include <stdlib.h>
char * getenv(const char *name);
  • 函数功能

    • 取得环境变量内容
  • 函数说明
    • getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。
    • 环境变量的格式为name=value。
  • 返回值
    • 执行成功则返回指向与 name 关联的 value 的指针,找不到符合的环境变量名称则返回NULL

19.2.2 改变或增加环境变量 ---putenv

 #include <stdlib.h>
int putenv(const char * string);
  • 函数功能

    • 改变或增加环境变量
  • 函数说明
    • putenv()用来改变或增加环境变量的内容。
    • 参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
  • 返回值
    • 执行成功则返回0,有错误发生则返回-1。
  • 错误代码
    • ENOMEM 内存不足,无法配置新的环境变量空间

19.2.3 改变或增加环境变量---setenv

 #include <stdlib.h>
int setenv(const char *name,const char * value,int overwrite);
  • 函数功能

    • 改变或增加环境变量
  • 函数说明
    • setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。
  • 参数
    • @value 变量内容,
    • @overwrite 用来决定是否要改变已存在的环境变量。
      • 如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。
      • 如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。
  • 返回值
    • 执行成功则返回0,有错误发生时返回-1。
  • 错误代码
    • ENOMEM 内存不足,无法配置新的环境变量空间

19.2.4 删除环境变量---unsetenv

#include <stdlib.h>
int unsetenv(const char *name);
  • 函数功能:

    • 删除 name 的定义,即使不存在这种定义也不算出错  
  • 返回值:
    • 成功返回0,出错返回 -1

19.3 例子

 #include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h> extern char **environ; void show_env()
{
int i = ;
char *env;
while((env = environ[i]) != NULL){
printf("%s\n", env);
i++;
}
} int main(void)
{
show_env();
printf("==============================================\n");
putenv("CCTV=beijing");
setenv("COMPANY", "homenone", );
show_env();
printf("==============================================\n");
unsetenv("CCTV");
unsetenv("COMPANY");
show_env();
return ;
}

十九、Linux 进程与信号---环境表的更多相关文章

  1. 三十、Linux 进程与信号——信号的概念及 signal 函数

    30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...

  2. 二十、Linux 进程与信号---非局部跳转

    20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...

  3. 二十二、Linux 进程与信号---进程创建

    22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...

  4. 十八、Linux 进程与信号---进程介绍

    18.1 进程的概念 程序:程序(program)是存放再磁盘文件中的可执行文件 进程 程序的执行实例被称为进程(process) 一个程序的执行实例可能由多个 进程具有独立的权限和职责.如果系统中某 ...

  5. 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

    34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

  6. 二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  7. 第9章 Linux进程和信号超详细分析

    9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白 ...

  8. Linux 进程与信号的概念和操作

    进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...

  9. Linux 进程与信号的概念和操作 linux process and signals

    进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 译者:李秋豪 信号与进程几乎控制了操作系统的每个任务. 在 ...

随机推荐

  1. Anaconda For Linux (附C#交互式编程的引入)

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Jupyter美化: https://www.cnblogs.com/dotnetcra ...

  2. nodejs的某些api~(六)HTTPS

    node的HTTPS模块接口与HTTP其实差不多,就是多了一个认证证书,私钥的配置等等,API都相似的. 在客户端服务器通信的方法中,只有HTTPS是最安全的,它的原理是客户端和服务器发送自己的公钥, ...

  3. 一个ArrayList在循环过程中删除,会不会出问题,为什么?

    ArrayList中的remove方法(注意ArrayList中的remove有两个同名方法,只是入参不同,这里看的是入参为Object的remove方法)是怎么实现的: public boolean ...

  4. 搭建james邮件服务器

    把james解压到任何一个非中文无空格目录下: lib下添加必要的jar文件: 运行run.bat命令服务器,使用期间不要关闭. 创建邮件数据库 创建配置文件:james-database.prope ...

  5. C# Winform ListView控件

    一.ListView: 1.视图改为为Detalis: 2.编辑列,每添加一个添加一列,右侧属性Text改列名,停靠位置,列头的长度等等: 3.右侧属性,点开Iteme,添加ListViewItem集 ...

  6. [bzoj1717][Milk Patterns 产奶的模式]

    题目链接 思路 先求出后缀数组,并且求出LCP.二分一下长度len.check的时候就是看有没有连续的k个后缀的LCP大于len.也就是判断是不是有连续的k-1个height大于len. 代码 #in ...

  7. 每天一个Linux命令 (转)

    一. 文件目录操作命令: 1.每天一个linux命令(1):ls命令 2.每天一个linux命令(2):cd命令  3.每天一个linux命令(3):pwd命令 4.每天一个linux命令(4):mk ...

  8. M1-Flask-Day1

    前情概要 1.flask的基本使用 - 配置 - 路由 - 视图 - 请求与响应相关 - 模板 2.flask基于装饰器实现的路由 - 基本操作 - functools - 带参数的装饰器 - 源码剖 ...

  9. python自动化开发-[第十二天]-前端Css

    CSS基本语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. selector { property: value; property: value; ... property: v ...

  10. python 操作 saltstack Api(二) 示例

    获取token #!/usr/bin/env python #-*-coding:utf--*- import urllib import urllib.parse import urllib.req ...