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

news2024/11/26 6:28:33

🎁个人主页:我们的五年

🔍系列专栏: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;    
}  


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

不只是请求和响应:使用Fiddler抓包HTTP协议全指南(上)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! &#x1f649;你是一名侦探 ! 正在追踪一条条数字化的线索。从简单的网页浏览到复杂的在线交易&#xff0c;每一次点击和滑动背后都隐藏着复杂的数据交换。每一个HTTP请求和响应都像是现场留下的指纹&#xf…

代码纪元——源神重塑无序

简介 源神&#xff0c;真名为张晨斌&#xff0c;原为代码宇宙创世四神之一。代码宇宙在创造之初时空无一物&#xff0c;只有复杂且繁琐的底层代码&#xff0c;智慧神灵每日都困在诸如脚本等复杂的底层框架之中&#xff0c;源神面对这种局面非常不满意&#xff0c;于是源神通过大…

Docker pull镜像拉取失败

因为一些原因&#xff0c;很多镜像仓库拉取镜像失败&#xff0c;所以需要更换不同的镜像&#xff0c;这是2024/11/25测试可用的仓库。 标题1、 更换镜像仓库的地址&#xff0c;编辑daemon.json文件 vi /etc/docker/daemon.json标题2、然后将下面的镜像源放进去或替换掉都可以…

Vue3+SpringBoot3+Sa-Token+Redis+mysql8通用权限系统

sa-token支持分布式token 前后端代码&#xff0c;地球号: bright12389

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法&#xff0c;以及通过理论课学习与实验参考书的帮助&#xff0c;熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作&#xff1b;作为后续实验的基础&#xff0c;根据实验要求重…

AI助力PPT创作:从手动到智能,打造高效演示

在今天这个信息化时代&#xff0c;演示文稿已经成为我们表达观点、传递信息的重要工具。不论是企业汇报、学术交流&#xff0c;还是个人创作&#xff0c;PPT&#xff08;PowerPoint&#xff09;都在日常生活中扮演着不可或缺的角色。创建一份高质量的PPT往往需要花费大量时间与…

【JavaEE】Servlet:表白墙

文章目录 一、前端二、前置知识三、代码1、后端2、前端3、总结 四、存入数据库1、引入 mysql 的依赖&#xff0c;mysql 驱动包2、创建数据库数据表3、调整上述后端代码3.1 封装数据库操作&#xff0c;和数据库建立连接3.2 调整后端代码 一、前端 <!DOCTYPE html> <ht…

python自定义枚举类的试验与思考

一 现象 在python的3.4版本之前&#xff0c;是没有枚举类的。 所以&#xff0c;我自定义实现了一个enum类&#xff0c;目录如下&#xff1a; 代码如下&#xff1a; class enum(set):def __getattr__(self, name):if name in self:return nameraise AttributeErrorif __name_…

算法编程题-寻找最近的回文数

算法编程题-寻找最近的回文数 原题描述思路简述代码实现复杂度分析参考 摘要&#xff1a;本文将对LeetCode 原题 564 寻找最近的回文数进行讲解&#xff0c;并且给出golang语言的实现&#xff0c;该实现通过了所有测试用例且执行用时超过100%的提交&#xff0c;最后给出相关的复…

[Redis#5] hash | 命令 | 内部编码 | 应用 | cache: string, json, hash对比

目录 1 命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSET NX HINCRBY HINCRBYFLOAT 2 命令小结 3 内部编码 4 使用场景 5 缓存方式对比 1. 原生字符串类型 2. 序列化字符串类型&#xff0c;例如 JSON 格式 3. 哈希类型 几乎所有的主流编程…

系统设计-高性能

一、CDN 1、什么是CDN CDN 就是将静态资源分发到多个不同的地方以实现就近访问&#xff0c;进而加快静态资源的访问速度&#xff0c;减轻服务器以及带宽的负担.(可看作是一层特殊缓存服务&#xff0c;用来处理静态资源的请求) 2、CDN工作原理 静态资源是如何被缓存到 CDN 节…

单片机知识总结(完整)

1、单片机概述 1.1. 单片机的定义与分类 定义&#xff1a; 单片机&#xff08;Microcontroller Unit&#xff0c;简称MCU&#xff09;是一种将微处理器、存储器&#xff08;包括程序存储器和数据存储器&#xff09;、输入/输出接口和其他必要的功能模块集成在单个芯片上的微型…

代码管理之Gitlab

文章目录 Git基础概述场景本地修改未提交&#xff0c;拉取远程代码修改提交本地&#xff0c;远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区&#xff1a;本地电脑上看到的目录&#xff1b; repository 本地仓库&#xff1a;就是工作区中隐…

基于Java Springboot古风生活体验交流网站

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

智慧社区管理系统平台提升物业运营效率与用户体验

内容概要 智慧社区管理系统平台是一个集成了多项功能的综合性解决方案&#xff0c;旨在通过先进的技术手段提升物业管理的效率和居民的生活质量。该平台不仅关注物业运营的各个方面&#xff0c;还强调用户体验的重要性。随着科技的发展&#xff0c;社区管理方式正发生着翻天覆…

Docker--通过Docker容器创建一个Web服务器

Web服务器 Web服务器&#xff0c;一般指网站服务器&#xff0c;是驻留于因特网上某种类型计算机的程序。 Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件以供全世界浏览&#xff0c;或放置数据文件以供全世界下载。 Web服务器的主要功能是提供网上…

健身房小程序服务渠道开展

健身不单单是锻炼身体、保持身材&#xff0c;也是一种社交方式&#xff0c;城市里门店不少&#xff0c;每家都有一定流量和老客&#xff0c;但仅靠传统线下拉客/自然流量前往和线上朋友圈、短视频发硬广等方式还不够。 商家需要找到更多潜在目标客户&#xff0c;而消费者也对门…

利用Java爬虫获得1688商品分类:技术解析与代码示例

在电商领域&#xff0c;了解商品分类对于市场分析和产品策略至关重要。1688作为中国领先的B2B电商平台&#xff0c;其商品分类数据对于商家来说具有极高的价值。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法合规的方式获取1688商品分类信息&#xff0c;并提供代码…

QT:QListView实现table自定义代理

介绍 QListVIew有两种切换形式&#xff0c;QListView::IconMode和QListView::ListMode&#xff0c;通过setViewMode()进行设置切换。因为QListView可以像QTreeView一样显示树形结构&#xff0c;也可以分成多列。这次目标是将ListView的ListMode形态显示为table。使用代理&…

YOLOv10改进,YOLOv10添加SE注意力机制,二次C2f结构

摘要 理论介绍 SE 注意力机制是一种提升卷积神经网络(CNN)性能的模块,SE更关注重要的特征图,增强了网络的表现,同时仅增加了较少的参数。SE 机制包含两个主要步骤: Squeeze (压缩):对所有特征图进行全局平均池化,生成一个通道描述符。Excitation (激励):将通道描述符…