【Linux】进程基础概念【下篇】

目录

1. 基本概念

2. 常见环境变量

常见环境变量指令

(1. PATH

(2. HOME

(3. SHELL

3.环境变量的组织形式

(1)通过代码如何获取环境变量

(2)普通变量与环境变量的区别

(3)命令行参数


1. 基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

2. 常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

常见环境变量指令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

查看方法:

echo   $变量名 

(1. PATH

1. 创建hello.c文件

 我们打印一句hello!

2. 对比./hello执行和之间hello执行

 

3. 为什么有些指令可以直接执行,不需要带路径(如访问文件夹),而我们的二进制程序需要带路径才能执行?

 我们查看环境变量:

 4. 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:hello程序所在路径

 

但这种修改的环境变量仅此次登录有效。 

(2. HOME

 这个比较简单,查看环境变量,表示的就是自己的根目录

跟登录用户有关系。 

(3. SHELL

 

3.环境变量的组织形式

没错环境变量是以指针数组的形式存储。每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串 

(1)通过代码如何获取环境变量

1. 命令行第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[]) //先不管前面2个参数,最后一个就是环境变量
           // 的指针数组,参数一般都是由其父进程传递,追跟溯源就是bash传递                                  
{
 int i = 0;
 for(; env[i]; i++){
 printf("%s\n", env[i]);
 }
 return 0;
}
2.通过第三方变量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 声明

3. (常用)通过接口函数

getenv()

我们来问问man ,也就是我们输入getenv我们要查看的环境变量名。 

我们实验下面代码:

    #include <iostream>
  2 #include <unistd.h>
  3 using namespace std;
  4 
  5 int main()
  6 {
  7   cout << "begin-------------" << endl;
  8   cout << "打印环境变量day:" << getenv("day") << endl;
  9   cout << "当前PID:"<< getpid() << " 父进程PID:"<< getppid() << endl;
 10   cout << "end---------------" << endl;
 11   while (1)
 12   {
 13   }
 14   return 0;
 15 } 

环境变量传递方式:  bash -> 父进程A -> 子进程B

(2)普通变量与环境变量的区别

普通变量定义:

可见普通变量,我们直接就可以定义,但毕竟不是环境变量,无法查到,无法让子进程继承。当然升级为环境变量也很简单。

(3)命令行参数

我们回顾前面的代码,main函数中的前几个参数是干什么的?

#include <stdio.h>
int main(int argc, char *argv[], char *env[])                                  
{
 return 0;
}

我们通过他们参数类型来简单测试一下

    1 #include <iostream>
    2 using namespace std;                                        
    3                     
    4 int main(int argc, char *argv[], char *env[])
    5 {                                            
    6   cout << "argv:"<< endl;                    
    7    for (int i =1; i < argc; i++)    
    8    {                                
    9      cout << argv[i] << endl;     
         }                                
   11   return 0;                         
   12 }     

意义: 可以通过指令,传入不同的参数来选择不同的功能,这一点我们输入指令时经常遇见。

  

结语

   本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力

猜你喜欢

转载自blog.csdn.net/qq_72112924/article/details/132282910