Linux个人学习笔记——环境变量、进程地址空间

并发

进程切换、时间片:基于进程切换基于时间片轮转的调度算法
为什么函数返回值,会被外部拿到?
答:通过CPU寄存器。

return a; ——>move eax 10

系统如何得知我们的进程当前执行到哪行代码?
答:程序计数器pc,eip:记录当前进程正在执行指令的下一行指令的地址

寄存器

通用寄存器:eax,ebx,ecx,edx
栈帧:ebp,esp,eip
状态寄存器:status
那么寄存器扮演者一个什么角色?
答:为了提高效率,将进程的高频数据放入寄存器中,因此cpu内的寄存器里面保存的是进程相关的数据,简而言之,cpu寄存器里面保存的是进程的临时数据,称为当前进程的上下文。
那为什么要有上下文数据?
答:进程在CPU上离开的时候,要将自己的上下文数据保存好,甚至带走,目的是为了恢复数据
因此,进程在被切换的时候,有两个操作:

  • 保存上下文
  • 恢复上下文

环境变量

基本概念

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

见一见环境变量

指令:echo $PATH

echo $PATH

输出结果
PATH:LINUX系统指定的指令搜索路径,以“:”为分割符。

添加指令路径

前置:编写一个自己写的可执行程序,
指令名:

PATH=$PATH:可执行文件所在的路径名

**注意:**不加$PATH则会覆盖所有环境变量
如果环境变量改错了,将xshell退了重新登陆一下即可

查看环境变量

指令:

env

输出结果
HISTSIZE :最多能保存的历史数据

命令行参数

int main(int argc,char* argv[],char* env)
{
}

我们先看前两个,那么这里的argc,argv是什么作用呢?
我们先写一个mycmd.c文件

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

make一下生成可执行程序,依次输入指令

.\mycmd
.\mycmd -a
.\mycmd -a -b
.\mycmd -a -b -c

以下是输出结果:
输出结果
首先,main函数是函数,也就是说main函数也可以被调用,实际上,第一个被调用的函数是Startup();
其次,命令行输入时,在bash看来就是一串字符串,会以空格符为间隔打散为几个子串,bash会将这些子串传入argv[]中,那么具体会有什么作用呢?让我们在mycmd.c里做点小小的改动:

if(argc!=2)
      {
        printf("Usag:%s -[a|b|c|d]\n",argv[0]);
        return 0;
      }
      if(strcmp(argv[1],"--help")==0)
      {
        printf("Usage:%s -[a|b|c|d]\n",argv[0]);
      }
    
      else if(strcmp(argv[1],"-a")==0)                                                                                                                                
      {
        printf("功能1\n");
      }
    
      else  if(strcmp(argv[1],"-b")==0)
      {
        printf("功能2\n");
      }
      else if(strcmp(argv[1],"-c")==0)
      {
        printf("功能3\n");
      }
      else if(strcmp(argv[1],"-d")==0)
      {
        printf("功能4\n");
      }
      else
      {
        printf("default功能\n");
     }

编译生成可执行文件后,依次运行如下指令:

./mycmed
./mycmed --help
./mycmed -a
./mycmed -b
./mycmed -c
./mycmed -d
./mycmed -d

以下是运行结果:
运行结果
可以看到随着命令行参数的不同,程序所执行的功能也会有所不同。
所以命令行参数的意义是:为指令、工具、软件等提供命令行选项的支持

env参数

有名字可以看出来,这是环境变量。,接下来我们遍历一下环境变量。
我们再对mycmd.c进行修改:

   int i=0;
   for(;env[i];++i)
   {
   		printf("env[%d]->%s\n",i,env[i]); 
   	}                                                                                                                                                                                                                                                   

编译一下后进行运行,下面是运行结果:
输出结果
所以我们也能自己获得环境变量。
所以main函数中有两张重要的向量表:

  1. 命令行参数表
  2. 环境变量表
    并且我们发现我们所运行的进程,都是子进程,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的所有环境变量。

我们所运行的进程,都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给他的所有环境变量

导入自己的环境变量

export 环境变量

本地变量&& 内建命令

本地变量:可以在命令行中直接定义,本地变量只会在本bash中有效,不会被继承
查看本地变量

set

常规命令——通过创建子进程完成的
内建命令——bash不创建子进程,而是自己亲自执行,类似于bash调用了自己写的或者系统提供的函数。

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值