回顾一些常识————环境变量

news/2024/11/17 1:46:51/文章来源:https://www.cnblogs.com/aoximin/p/18390594

前言

最近写一些底层一些的东西,简单回顾一下环境变量.

正文

首先我们来看下c 语言的环境变量的位置。

可以看到每个进程都有自己的环境变量,操作系统会复制环境变量的副本给一个新创建的进程。

那么这个副本哪里来呢? 是操作系统自己维护一份在内存中吗?那不是,因为操作系统中进程有亲属关系。具体来说,操作系统会为新进程创建一个新的地址空间,并将父进程环境变量的副本复制到这个新的地址空间中。

这些通过操作系统干的活。这就解释了一个我们觉得比较神奇的东西。

那就是为啥我们在shell里面设置了一些环境变量哈,然后我们启动的一些新的进程就能用上这些环境变量,但是呢,当我们打开另外一个会话的时候,发现两者的环境变量并不一样,好像修改无效。

我们输入pstree,然后查看他们的关系,我们可以找到pstree。

我们可以从进程树来看这个问题,可以看到他们的关系是哈,是两条不同的分支。

也就是说进程启动后,每个进程的环境变量是独立的, 只能影响后面创建的子进程。

然后需要知道的是,这些都基于一个叫做systemd的父进程。

那么我们在程序中如何获得环境变量,去做一些事情呢?

首先操作系统会给进程一张环境表:

#include<stdio.h>
#include<stdlib.h>
extern char **environ;int main(void)
{printf("%p", environ);environ++;return 0;
}

这个environ 就是环境表的起始地址。

这样写是c语言的约定,看下汇编。

所以在编译的时候environ就会被赋值了,是一种约定。

那么如何获取全部的环境变量呢?现在我们知道了初始指针,同样能够知道最后一个指针是null。

那么可以这样做。

#include<stdio.h>
#include<stdlib.h>
extern char **environ;int main(void)
{while (environ!=NULL){printf("%s \n", *environ);environ++;}return 0;
}

遍历一下整个环境遍历表。

但是进程中一般不会去真的遍历整个环境遍历哈,一般只获取我们需要的。

#include<stdio.h>
#include<stdlib.h>
extern char **environ;int main(void)
{char* a = getenv("PATH");printf("%s \n", a);return 0;
}

同样提供了:

把一些东西的回顾了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/790183.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7系统更新在哪里,win7怎么关闭电脑更新呢

在Windows 7系统中,进行系统更新和关闭更新的操作主要通过“控制面板”来完成。以下是详细的步骤: 一、Win7系统更新在哪里 打开控制面板: 点击屏幕左下角的“开始”菜单,选择“控制面板”。 进入Windows Update: 在控制面板中,找到并点击“系统和安全”类别。 在“系统和…

8.Java异常

什么是异常实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了,等等。 软件程序在…

20221325-杨筱-Markdown学习

AI回答提示词: (1)深入浅出的讲解Markdown及其详细语法 Markdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,并通过简单的标记语法快速转换为格式丰富的HTML页面。Markdown被广泛应用于博客、文档编写、GitHub等平台,因其简洁的语法和高效的排版…

windows更新在哪里打开,想更新windows怎么打开更新呢

在Windows系统中,打开更新并更新电脑主要可以通过“设置”应用来完成。以下是详细的步骤: 一、打开Windows更新 通过“开始”菜单: 点击屏幕左下角的“开始”按钮(Windows徽标)。 在弹出的菜单中,选择“设置”图标(齿轮形状)。进入“更新和安全”设置: 在“设置”窗口…

「代码随想录算法训练营」第五十天 | 图论 part8

目录拓扑排序题目:117. 软件构建dijkstra(朴素版)题目:47. 参加科学大会dijkstra算法和prim算法的区别dijkstra(堆优化版)题目:47. 参加科学大会 拓扑排序 拓扑排序概括来说就是给出一个有向无环图,把这个有向无环图转成线性的排序,就叫拓扑排序。 使用广度优先搜索(…

贵州省专业技术人员继续教育刷课脚本-JavaScript编写

脚本 学习网站:gzjxjy.gzsrs.cn、ghlearning.com、gzzj.ghlearning.com、... 脚本地址:贵州省专业技术人员继续教育-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点…

源码、反码和补码

对于有符号数而言,原码就是一个数的二进制表示。二进制的最高位是符号位,0 表示正数,1 表示负数。比如 56 是十进制,转为二进制就是 00111000,于是 56 的原码就是 00111000,左边第一位 0 是符号位,后面的其他数字是数据位。 计算机用数的原码进行显示,数的计算和存储是…

作业:自我介绍+软工5问

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-12这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-12/homework/13219这个作业的目标 学习编辑博客、预习教材介绍我自己 大家好,很高兴在这里与大家分享一些关于我的个人经历和兴趣爱…

洛谷团队

团队宣传!!! luogu团队!!! 网址:https://www.luogu.com.cn/team/79256 我的ID:sunhy2012 如要加入,信息请填“__sunhy2012__推荐”

陕西省专业技术人员继续教育刷课脚本-JavaScript编写

脚本 学习网站:陕西省专业技术人员继续教育学习平台: jxjy01.xidian.edu.cn 脚本地址:陕西省专业技术人员继续教育-刷课脚本 教程 1.插件安装(以Microsoft Edge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击…

Go plan9 汇编: 打通应用到底层的任督二脉

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 作为一个严肃的 Gopher,了解汇编是必须的。本汇编系列文章会围绕基本的 Go 程序介绍汇编的基础知识。 1. Go 程序到汇编 首先看一个简单到令人发指的示例: package mainfunc main() {a := 1print(a) }运行程序,输出: # …

20221414徐鹿鸣Markdown学习作业

问题一:哪些内容是你掌握的?哪些内容是你没有掌握的?使用AI推荐的工具或者你喜欢的工具实践一下没有掌握的内容。通义千问的回复 对我而言,Markdown的基础语法我接触过一二,但余下的高级语法、各种工具以及它与人工智能生成的内容的关联我并不清楚。 StackEdit在线Markdow…