首页 > 其他分享 >回顾一些常识————环境变量

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

时间:2024-08-31 18:48:31浏览次数:4  
标签:操作系统 回顾 常识 char environ 进程 include 环境变量

前言

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

正文

首先我们来看下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;
}

同样提供了:

把一些东西的回顾了。

标签:操作系统,回顾,常识,char,environ,进程,include,环境变量
From: https://www.cnblogs.com/aoximin/p/18390594

相关文章

  • 如何获取环境变量的端口
    在获取后端服务时发现根本拿不到环境,打印出来时undefined我的.env文件是这样的:ENV=//192.168.10.2 但是根目录下main.js拿不到.env.development、.env.production端口号main.js:console.log(${import.meta.env});//undefinebaseURL:`//${import.meta.env}:8111`,//impor......
  • 8.4linux定时任务-环境变量-数据库
    配合SUID本地环境变量提权思路原理:利用sh环境变量替换,使得/tmp/ps得到root权限;ps=sh过程:手写调用文件-编译-复制文件-增加环境变量-执行gccdemon1.c-oshellcp/bin/sh/tmp/psexportPATH=/tmp:$PATH#webshell权限无法设置环境变量./shellid提前本地定时任务(cronta......
  • LeetCode 热题 100 回顾
    目录一、哈希部分1.两数之和 (简单)2.字母异位词分组 (中等)3.最长连续序列 (中等)二、双指针部分4.移动零 (简单)5.盛最多水的容器 (中等)6. 三数之和 (中等)7.接雨水 (困难)三、滑动窗口8.无重复字符的最长子串 (中等)9.找到字符串中所有字母异位词 (中等)四、子串10.......
  • 使用 setenv 配置文件管理 Tomcat 的自定义环境变量
    1、背景描述有时候,我们会在catalina.bat或catalina.sh文件中,自定义一些环境变量,例如额外指定JDK路径或设置JVM参数。实际上,直接在catalina.bat或catalina.sh文件中,自定义环境变量的做法,是不规范的。因为在对Tomcat进行(小版本)升级时,新版本的catalina.bat或cata......
  • 物联网安全的系统回顾
    ......
  • LeetCode 面试经典 150 题回顾
    目录一、数组/字符串1.合并两个有序数组 (简单)2.移除元素 (简单)3.删除有序数组中的重复项 (简单)4.删除有序数组中的重复项II(中等)5.多数元素(简单)6.轮转数组 (中等)7.买卖股票的最佳时机(简单)8.买卖股票的最佳时机II (中等)9.跳跃游戏(中等)10.跳跃游戏II(中等)11.H指......
  • 聚焦超声换能器结构学习的回顾和目标-1
    回顾:聚焦超声换能器的主要核心元器件主要为三个分别是:匹配层、压电陶瓷换能器片、背衬。通过有方向和周期切换的电压施加在换能器片的两端,使其振荡;匹配层进行匹配(声阻抗的计算匹配方式等下再说),保证高效的声传播;背衬的作用就是吸声且减少脉冲持续时间(就是振荡衰减过程)。我不......
  • 活动回顾丨云原生开源开发者沙龙上海站回放 & PPT 下载
    8月2日,云原生开源开发者沙龙AI原生应用架构专场在上海举办,现场围绕AI应用开发和Agent编排、API网关、可观测、智能编程、消息队列等视角分享了我们的开源成果和进展,以及落地实践。以下为分享回顾。关注公众号,后台回复:0802免费获得上海站讲师PPT合辑精彩回顾①分......
  • nuxt3项目自定义环境变量,typescript全局提示
    最近使用nuxt3框架来写项目,其中有一点就是typescript语法提示让人闹心,使用vscode编辑器,如果有语法提示进行编码,工作效率可以提升一个档次。本篇文章说的就是如何在vscode中使用nuxt3框架,自定义环境变量,支持typescript语法提示。列出当前使用的环境版本node#21.4.0......
  • 上周热点回顾(8.19-8.25)
    热点随笔:· 会员力量:非常感谢58位园友成为终身会员 (博客园团队)· 【故障公告】博客站点遭遇大规模DDoS攻击 (博客园团队)· 使用FModel提取《黑神话:悟空》的资产 (paw5zx)· 寻访中国100家.NET中大企业——第二站:苏州行 (一线码农)· 花了一天时间帮财务朋友开发......