Linux之进程(三)(环境变量)

简介: Linux之进程(三)(环境变量)



一、基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:临时文件夹位置和系统文件夹位置等。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

二、环境变量

使用env命令可以查看当前系统中的所有环境变量。

1、PATH

要执行一个程序,那就需要先找到这个程序,怎么去找,这时候就需要带上路径,如我们经常使用的  ./  的方式。

再比如,我们使用的各种系统命令(ls, grep等),我们都知道其实它们是存在一些文件中的,我们在使用时也可以通过完整的路径去使用它们。但是运行一个程序能不能像使用命令那样只需要输入它的名字,就可以使它运行呢?

如下图:我们可以通过使用pwd的完整路径来使用pwd。

这时,我们就可以使用PATH来帮助我们。当要求操作系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到PATH中指定的路径去找。

所以,我们写的可执行程序无法像系统命令那样使用的根本原因就是其路径不在PATH环境变量所维护的搜索路径中。

如下图:我们常使用的各种系统命令就在PATH里的各种路径中。如:/usr/bin/pwd。

我们可以把可执行程序的路径添加到PATH中,就可以像系统命令一样使用了。如下:使用下面的命令添加。

export PATH=$PATH:路径

2、HOME

指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

3、SHELL

当前Shell,它的值通常是/bin/bash。

和环境变量相关的命令

1、echo: 显示某个环境变量值

2、export: 设置一个新的环境变量

3、env: 显示所有环境变量

4、unset: 清除环境变量

5、set: 显示本地定义的shell变量和环境变量

三、环境变量参数

在前面的语法学习中,我们知道main函数也是存在命令行参数的,int argc 和 char* argv[]。但是事实上main函数有三个参数,还有一个就是环境变量参数 char* env[],它是用来获取环境变量的。

环境变量的组织方式:

env是一个指针数组,它里面的指针分别指向不同的环境变量对应的字符串。

通过getenv获取环境变量

通过代码获取环境变量

根据main的第三个参数来获取环境变量。

环境变量的全局性

环境变量是定义在系统中的变量,那它为什么在其他的进程中也有效呢?因为环境变量具有全局属性。

在命令行上运行./mytest_g的时候,bash是一个系统进程,mytest_g会变成一个进程,是bash的子进程,而环境变量具有全局属性的根本原因是会被子进程继承下去,因为环境变量定义给bash,而子进程会全部继承下去,这就被称为环境变量。所以环境变量具有全局性,而本地变量只会在当前进程有效。

四、argc和argv

上面我们讲了main函数的第三个环境变量参数,下面我们来讲一下前两个参数。这两个是命令行参数。

命令行参数实际上是把程序名和选项传递给argv的,选项多少就需要定义argv的大小。参数的意义在于可以通过命令行选项控制使其结果不同。

我们通过下面的代码来解释:

运行程序:

我们发现上面的和命令+选项的格式是一样的,那么这两者有什么关系吗?

其实命令后面所带的选项,就是通过命令行参数来实现的。进而通过不同的选项来实现不同的功能。

目录
相关文章
|
2天前
|
算法 Linux C++
【探索Linux】P.31(守护进程)
【探索Linux】P.31(守护进程)
15 7
|
2天前
|
存储 安全 Linux
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
【探索Linux】P.18(进程信号 —— 信号捕捉 | 信号处理 | sigaction() )
5 0
|
2天前
|
存储 算法 Linux
【探索Linux】P.17(进程信号 —— 信号保存 | 阻塞信号 | sigprocmask() | sigpending() )
【探索Linux】P.17(进程信号 —— 信号保存 | 阻塞信号 | sigprocmask() | sigpending() )
4 0
|
2天前
|
算法 Linux C++
【探索Linux】P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)
【探索Linux】P.16(进程信号 —— 信号产生 | 信号发送 | 核心转储)
3 0
|
2天前
|
消息中间件 存储 Unix
【探索Linux】P.15(进程间通信 —— system V共享内存)
【探索Linux】P.15(进程间通信 —— system V共享内存)
10 0
|
2天前
|
消息中间件 Unix Linux
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
【探索Linux】P.14(进程间通信 | 匿名管道 | |进程池 | pipe() 函数 | mkfifo() 函数)
8 0
|
5天前
|
Linux Shell C语言
|
5天前
|
监控 Linux Shell
|
8天前
|
Linux Shell
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
|
9天前
|
存储 Web App开发 运维