十九、Linux 进程与信号---环境表
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 进程与信号---环境表的更多相关文章
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- 二十、Linux 进程与信号---非局部跳转
20.1 setjmp 和 longjmp 函数 20.1.1 函数介绍 #include <setjmp.h> int setjmp(jmp_buf env); 函数功能:设置非局部跳转 ...
- 二十二、Linux 进程与信号---进程创建
22.1 fork 和 vfork 函数 22.1.1 函数说明 #include <unistd.h> #include <sys/types.h> pid_t fork( ...
- 十八、Linux 进程与信号---进程介绍
18.1 进程的概念 程序:程序(program)是存放再磁盘文件中的可执行文件 进程 程序的执行实例被称为进程(process) 一个程序的执行实例可能由多个 进程具有独立的权限和职责.如果系统中某 ...
- 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数
34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...
- 二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- 第9章 Linux进程和信号超详细分析
9.1 进程简单说明 进程是一个非常复杂的概念,涉及的内容也非常非常多.在这一小节所列出内容,已经是我极度简化后的内容了,应该尽可能都理解下来,我觉得这些理论比如何使用命令来查看状态更重要,而且不明白 ...
- Linux 进程与信号的概念和操作
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 信号与进程几乎控制了操作系统的每个任务. 在shell中输 ...
- Linux 进程与信号的概念和操作 linux process and signals
进程 主要参考: http://www.bogotobogo.com/Linux/linux_process_and_signals.php 译者:李秋豪 信号与进程几乎控制了操作系统的每个任务. 在 ...
随机推荐
- numpy nan值的判断
我发现在数据处理中非常常见的就是nan值的判断,筛选数据尤为常见, 判断数据是否为nan,前提是np.float类型数组,但在应用于对象数组时会引发TypeError # 返回bool类型 np.is ...
- CSS解决字母不换行
通过百度,查找解决方案 1. word-break:break-all;只对英文起作用,以字母作为换行依据2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据
- bzoj1497 最大获利(最大权闭合子图)
题目链接 思路 对于每个中转站向\(T\)连一条权值为建这个中转站代价的边.割掉这条边表示会建这个中转站. 对于每个人向他的两个中转站连一条权值为\(INF\)的边.然后从\(S\)向这个人连一条权值 ...
- BigInteger与BigDecimal
BigInteger与BigDecimal Java大数字运算(BigInteger类和BigDecimal类) 在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger ...
- bouncing-balls-evil-circle
效果如下 代码目录 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...
- Echarts关于仪表盘
https://blog.csdn.net/zc763375777/article/details/53837391 来无事,制作不一样的图标一发,领导让把仪表盘做成百分条,我TM也是醉了,大体样式如 ...
- 多元线性回归(Multivariate Linear Regression)简单应用
警告:本文为小白入门学习笔记 数据集: http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearnin ...
- Linux系统下DNS主从配置详解
一.DNS概述DNS(Domain Name System),即域名系统.因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串. ...
- 【强大的Java集成开发工具】MyEclipse 2015 Stable 2.0 for Mac
[简介] MyEclipse是一款 Mac 上的Java 强大的集成开发工具,今天和大家分享最新的 MyEclipse 2015 Stable 2.0 版本,MyEclipse 2015 基于 Ecl ...
- 洛谷P1073 Tarjan + 拓扑排序 // 构造分层图
https://www.luogu.org/problemnew/show/P1073 C国有 n n个大城市和 mm 条道路,每条道路连接这 nn个城市中的某两个城市.任意两个城市之间最多只有一条道 ...