做招聘网站都需要什么手续,视频号的链接在哪,打鱼网站建设,网站搭建平台demo免费【Linux进程篇】环境变量 目录 【Linux进程篇】环境变量基本概念常见环境变量查看环境变量方法测试PATH测试HOME测试SHELL和环境变量相关的命令环境变量的组织方式通过代码如何获取环境变量命令行参数命令行第三个参数通过第三方变量environ获取 本地变量通过系统调用获取或设置…【Linux进程篇】环境变量 目录 【Linux进程篇】环境变量基本概念常见环境变量查看环境变量方法测试PATH测试HOME测试SHELL和环境变量相关的命令环境变量的组织方式通过代码如何获取环境变量命令行参数命令行第三个参数通过第三方变量environ获取 本地变量通过系统调用获取或设置环境变量环境变量通常是具有全局属性的验证子进程会继承父进程的环境变量验证子进程不会继承父进程的本地变量 作者爱写代码的刚子 时间2023.8.13 前言本篇博客主要介绍操作系统中环境变量有关的知识了解环境变量有关的指令。 基本概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性
常见环境变量
PATH : Linux系统的指令搜索路径HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量方法
echo $NAME //NAME:你的环境变量名称
测试PATH
添加PATH
注意不能写做PATH新路径名称否则之前的PATH将会全部清空 正确写法 直接运行test.exe文件
此环境变量是内存级别的当用户如果不小心改错了重新登陆Xshell即可。系统文件中已经预存好了环境变量
测试HOME
用root和普通用户分别执行 echo $HOME ,对比差异
测试SHELL 保存的是当前shell的可执行程序 . 执行 cd ~ ; pwd,对应~ 和 HOME 的关系
和环境变量相关的命令
echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量
HISTSIZE Xshell能记录的最大历史指令条数USER当前用户LD_LIBRARY_PATH指定查找共享库动态链接库时除了默认路径之外的其他路径。PATH可执行程序的搜索路径LS_COLORS ls的配色方案MAIL是指当前用户的邮件存放目录。PWD当前所处的路径LANG用于定义系统的主语系环境HISTCONTROL可以控制历史的记录方式HOME用户的主目录(也称家目录)SHLVL记录了bash嵌套的层次一般来说我们启动第一个Shell时。 $SHLVL1。如果在这个Shell中执行脚本脚本中的 $SHLVL2 。LOGNAME LOGNAMELESSOPEN
unset: 清除环境变量unset 环境变量名set: 显示本地定义的shell变量和环境变量
环境变量的组织方式 每个程序都会收到一张环境表环境表是一个字符指针数组每个指针指向一个以’\0’结尾的环境字符串
通过代码如何获取环境变量
命令行参数
main函数并不是第一个被调用的函数而是startup函数 编译器如何知道main函数的参数个数答条件编译 argc就是argv数组中的元素个数,argv指针数组也叫向量表输入./test -a -b其实是./test -a -b,bash会将其分成三个字符串./test “-a” “-b”,将这些字符串初始化argv指针*数组命令行参数可以为指令、工具、软件提供功能选项支持指令可以带不同的选项和命令行参数有关
命令行第三个参数
C/C代码会有两张核心向量表1. 命令行参数表2. 环境变量表,不要简单理解程序启动就是将进程加载到内存而是自己的程序在启动时需要有人调用main函数将这两张核心向量表传进来 我们所运行的进程都是子进程bash本身在启动的时候会从操作系统的配置文件中读取环境变量信息子进程会继承父进程交给我们的环境变量我们定好的环境变量可以让所有的子进程继承下去所以环境变量具有全局属性但是注意环境变量也是数据默认情况下是父子共享的由于进程具有独立性创建完子进程后如果想对环境变量进行修改是不能影响父进程的因为会写实拷贝
环境变量被继承通常有两种方式1. 直接继承 2. main函数传参
通过第三方变量environ获取
#include stdio.h
int main(int argc, char *argv[])
{extern char **environ;int i 0;for(; environ[i]; i){printf(%s\n, environ[i]);}return 0;
}libc中定义的全局变量environ指向环境变量表environ没有包含在任何头文件中所以在使用时要用extern声明。
程序在编译过程中会链接C库 所以 extren本身就是说我有一个什么样子的变量 然后在链接的过程当中在 C库可以找到这个是正常的。
本地变量
直接在命令行定义的变量叫做本地变量 set查看本地变量和环境变量 本地变量是不会被子进程继承的
通过系统调用获取或设置环境变量 putenv(环境变量value) getenv(环境变量) 可以通过比较getenv(“USER”)来判断登陆用户是不是正确的和权限建立起连接
常用getenv和putenv函数来访问特定的环境变量。
环境变量通常是具有全局属性的
环境变量是系统提供的一组namevalue形式的变量不同的环境变量有不同的用户通常具有全局属性。环境变量通常具有全局属性可以被子进程继承下去
验证子进程会继承父进程的环境变量
导入环境变量 运行test 子进程是可以继承父进程的环境变量的
验证子进程不会继承父进程的本地变量 虽然子进程不会继承父进程的本地变量但是我们可以向子进程中导入父进程的本地变量
【问题】echo也是bash的子进程那为什么echo能拿到并显示父进程的本地变量呢 答命令行上的指令并不一定都需要创建子进程所以命令分为两种命令
常规命令——通过子进程创建来完成内建命令——bash不创建子进程而是由自己亲自执行类似于bash调用自己的写的或者系统提供的函数cd指令、echo指令
所以echo是内建命令自己获取自己的本地变量不创建子进程
【附】 chdir函数用于改变当前工作目录。调用参数是指向目录的指针调用进程需要有搜索整个目录的权限。每个进程都具有一个当前工作目录。在解析相对目录引用时该目录是搜索路径的开始之处。如果调用进程更改了目录则它只对该进程有效而不能影响调用它的那个进程。在退出程序时shell还会返回开始时的那个工作目录。