【Linux课程学习】:环境变量:HOME,su与su - 的区别,让程序在哪些用户下能运行的原理,环境变量具有全局性的原因?

🎁个人主页:我们的五年

🔍系列专栏:Linux课程学习 

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

HOME环境变量:

PWD环境变量:

USER和LOGNAME环境变量:

让我们的程序,指定某个用户运行:

su命令和su - 命令:

获得环境变量:

其他环境变量:

定义一个全局变量(shell维护的变量):

理解env,argv和export:

让子进程不被启动:

为什么子进程要继承父进程的环境变量?

获取环境变量的方式:


 

1.是先到家目录,然后再加载环境变量中的HOME?还是现有环境变量HOME,在根据这个到指定的目录呢?

是有环境变量HOME,环境变量先被加载。然后才能让工作路径到HOME目录。

2.bash也是一个进程,它的环境变量是根据用户和系统的配置文件来的。

3.所有的进程都是-bash的子进程。这些子进程的环境变量是从bash中拷贝的。

4.识别用户身份,不同的用户运行一个程序,不同用户的USER和LOGNAME是不同的,getenv又可以拿到这些环境变量,所以可以让哪些用户可以运行这个程序。

5.环境变量VS本地变量?

6.当创建一个子进程时,子进程会继承父进程的环境变量,这包括了操作系统级的环境变量,还有父进程设置的环境变量。

本地环境变量,默认不会传递给子进程。

子进程会继承父继承的环境变量。

7.为什么环境变量具有全局性?

因为子进程都会进程父进程的环境变量,所以子进程都能看到这些环境变量,也能进行操作。也可以传递给自己的子进程,让自己的子进程看到。

8.为什么要让子进程继承父进程的环境变量?

HOME环境变量:

表示当前用户的家目录,cd ~就是回到这样的目录。

刚刚登录shell的目录,就是该用户的家目录。


PWD环境变量:

当前进程的所在的工作路径。 


USER和LOGNAME环境变量:

 表示当前的用户。一般相同。

当我们用普通用户进行su切换到root时,没有真正登录root,所以USER和LOSNAME还是原来的普通用户。没有加载环境目标用户的环境变量,所以SUER和LOGNAME没有变化。

所以我们以后区分一个程序,就只要关注这两个环境变量就可以了。


让我们的程序,指定某个用户运行:

下面代码在root和kym用户下执行的结构如下:

要运行一个程序,就是操作系统要为这个程序开一个进程。我们这些进程全部都是-bash的子进程。当新建一个进程时,会继承父进程的环境变量。root用户进行登录shell和kym进行登录的环境变量USER和LOGNAME是不一样和。所以我们在getenv("USER")的时候,拿到的是不一样的字符串。所以执行就会发生区别。

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    
    
int main()    
{    
    if(strcmp(getenv("USER"),"kym")==0)    
    {    
        printf("用户为kym,执行成功!\n");    
    }    
    else    
    {    
        printf("用户不匹配,请用kym用户进行执行!\n");    
    }                                                                                                  
    return 0;    
}   

su命令和su - 命令:

su命令:

如果不指定用户名,那么默认切换到超级用户(root)。如果指定了用户名,那么就切换到指定的用户。不管切换到那个用户,都不会加载该用户的环境变量,和启动该用户的脚本。

su - 命令:

会启动目标用户的脚本和加载环境变量。


获得环境变量:

头文件:

#include <stdlib.h>

函数原型:

char *getenv(const char *name);

进程可以通过系统调用获得当前的工作路径,后面新建文件就直接可以getenv("PWD")新建就行。

比如通过getenv获取PATH环境变量。 

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

其他环境变量:

LANG:UTF -8 表示语言是万国码,在不同的语言不会出现乱码。

LODPWD:最近一个路径。

所以cd - 的原理就是去环境变量中拿OLDPWD,就可以让路径切换回去。

cd -:返回最近一个路径。


定义一个全局变量(shell维护的变量):

他们不属于环境变量,通过env查看环境变量的时候,没有发现i=10,这个环境变量。

有shell内部进行维护。

set:显式本地的shell变量和环境变量。

unset (变量名):清除所有shell维护的环境变量。

export:将我们上面定义的全局变量,导入到环境变量中。

i=10;
set


理解env,argv和export:

每启动一个shell,操作系统就会启动一个-bash进程。开辟一块空间,存放一系列东西,里面包含了环境变量env,还有命令行参数列表,还有本地的环境变量。我们定义一个全局变量,比如i=10。其实就是在本地变量表中,有一个值存着"i=10"这个字符串起始位置。

export的效果就是,让env表指向"i=10"字符串。

 shell脚本:在shell命令行中衍生出来的一种语言。因为命令行可以定义变量,识别for等一系列关键词。


让子进程不被启动:

运行一个程序,就是让-bash帮我们创建一个子进程。但是子进程不会继承父进程的本地变量,只会继承父进程的环境变量。所以我们在父进程设置一个变量,就能控制该程序能不能运行。

可以设置为要有这个环境变量才能运行,也可以设置没有这个环境变量才能运行。

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    
#include <unistd.h>                                                                                                                                                                                                
    
int main()    
{    
    char* is_running=getenv("ISRUNNING");    
    if(is_running==NULL)    
    {    
        while(1)    
        {    
            printf("程序被启动!\n");    
            sleep(1);    
        }    
    }    
    else    
    {    
        printf("程序启动失败!\n");    
    }    
    return 0;    
} 

这个程序就是:

1.没有ISRUNNING环境变量才能运行。

2.有ISRUNNING环境变量,getenv就返回NULL,打印"程序启动失败"


为什么子进程要继承父进程的环境变量?

a.系统的配置信息,尤其是具有指导性的配置信息。

我们给系统进行配置,就是让以后启动的任何进程都有这样的配置,而环境变量就是会把这些信息传递给以后的任何信息。而-bash的环境变量也是从bashrc和bash.profile文件中来的。所以在这些配置文件中配置一些信息,以后的进程都会有这些信息。

所以是配置信息生效的一种表现

b.进程是具有独立性的

所以如果父进程有数据要传给子进程。普通的数据是不会传递给子进程的,我们就可以通过环境变量进行传递。(只读数据)


获取环境变量的方式:

1.mian函数的第三个参数。

2.通过getenv函数获取。

3.通过environ全局变量获取。

extern:声明

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    
#include <unistd.h>    
                                                                                                                                                                                                                   
extern  char** environ;    
int main()    
{    
    for(int i=0;environ[i];i++)    
        printf("env[%d]:%s\n",i,environ[i]);     
    return 0;    
}  


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。适用场景&…

QRCode.toDataURL() vue3 uniapp h5在 Android环境下二维码显示不出来

“qrcode”: “^1.5.4” 修改前&#xff08;在浏览器里面是可以加载的&#xff09;&#xff1a; 查资料好像是Android上加载的是canvas&#xff0c;不是加载的img。 修改后&#xff1a; 这里val其实打印出来是svg代码&#xff0c;所以用v-html就好了。

数据结构——排序算法第一幕(插入排序:直接插入排序、希尔排序 选择排序:直接选择排序,堆排序)超详细!!!!

文章目录 前言一、排序1.1 概念1.2 常见的排序算法 二、插入排序2.1 直接插入排序2.2 希尔排序希尔排序的时间复杂度 三、选择排序3.1 直接选择排序3.2 堆排序 总结 前言 时间很快&#xff0c;转眼间已经到数据结构的排序算法部分啦 今天我们来学习排序算法当中的 插入排序 和 …

第32周:猴痘病识别(Tensorflow实战第四周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 1.3 查看数据 二、数据预处理 2.1 加载数据 2.2 可视化数据 2.3 再次检查数据 2.4 配置数据集 2.4.1 基本概念介绍 2.4.2.代码完成 三、构建CNN网络 四、编译 五、训练模型 六、模型评估 6.1 Loss和Accuracy…

【创建型设计模式】工厂模式

【创建型设计模式】工厂模式 创建型设计模式第二期&#xff01;本期介绍简单工厂模式和工厂方法模式。 简单工厂模式 简单工厂模式&#xff08;又叫作静态工厂方法模式&#xff09;&#xff0c;其属于创建型设计模式&#xff0c;简单工厂模式不属于设计模式中的 23 种经典模…

【Linux】安装cuda

一、安装nvidia驱动 # 添加nvidia驱动ppa库 sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update# 查找推荐版本 sudo ubuntu-drivers devices# 安装推荐版本 sudo apt install nvidia-driver-560# 检验nvidia驱动是否安装 nvidia-smi 二、安装cudatoolkit&…

上天入地 灵途科技光电技术赋能空间感知

近来&#xff0c;人工智能技术频频亮相各大马拉松赛事&#xff0c;成为引人注目的科技亮点。 11月3日&#xff0c;杭州马拉松首次启用了机器狗作为配速员&#xff0c;以稳定的节奏为选手提供科学的跑步节奏。 11月11日&#xff0c;亦庄半程马拉松的终点处&#xff0c;人形机器…

Java三大特性:封装、继承、多态【详解】

封装 定义 隐藏对象的属性和实现细节&#xff0c;仅对外公开接口&#xff0c;控制在程序中属性的读取和修改的访问级别便是封装。 在开发中造一个类就是封装&#xff0c;有时也会说封装一个类。封装可以隐藏一些细节或者包含数据不能被随意修改。 比如这是一个敏感的数据&a…

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)

【实战】并发安全的配置管理器&#xff08;功能扩展&#xff09; 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径&#xff1a; OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常&#xff0c;您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

苹果系统中利用活动监视器来终止进程

前言 苹果系统使用的时候总是感觉不太顺手。特别是转圈的彩虹球出现的时候&#xff0c;就非常令人恼火。如何找到一个像Windows那样任务管理器来终止掉进程呢&#xff1f; 解决办法 Commandspace 弹出搜索框吗&#xff0c;如下图&#xff1a; 输入“活动”进行搜索&#xff…

实战项目负载均衡式在线 OJ

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能自己实现负载均衡式在线 OJ。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1…

python Flask指定IP和端口

from flask import Flask, request import uuidimport json import osapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__:app.run(host0.0.0.0, port5000)

burp suite-1

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…

【区块链】深入理解椭圆曲线密码学(ECC)

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解椭圆曲线密码学(ECC)1. 概述2. 椭圆曲线的数学基础2.1 基本定义2.2 有限…

【Qt流式布局改造支持任意位置插入和删除】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、源代码二、删除代码三、扩展总结 前言 最近在做一个需求需要流式布局&#xff0c;虽然官方example里有一个流式布局范例&#xff0c;但是不能满足我的需求…

JQuery -- 第九课

文章目录 前言一、JQuery是什么&#xff1f;二、JQuery的使用步骤1.引入2.书写位置3. 表示方法 三、JQuery选择器1.层级选择器2. 筛选选择器3. 排他思想4. 精品展示 四、jQuery样式操作1. 修改样式2.类操作1. 添加2. 移除3. 切换 五、jQuery动画1. 显示和隐藏2. 滑动1. slide2.…

Python 版本的 2024详细代码

2048游戏的Python实现 概述&#xff1a; 2048是一款流行的单人益智游戏&#xff0c;玩家通过滑动数字瓷砖来合并相同的数字&#xff0c;目标是合成2048这个数字。本文将介绍如何使用Python和Pygame库实现2048游戏的基本功能&#xff0c;包括游戏逻辑、界面绘制和用户交互。 主…

在Elasticsearch中,是怎么根据一个词找到对应的倒排索引的?

大家好&#xff0c;我是锋哥。今天分享关于【在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 在Elasticsearch中&#xff0c;是怎么根据一个词找到对应的倒排索引的&#xff1f; 在 Elasticsearch 中…