0


【Linux】第五章 环境变量(概念补充+作用+命令+main三个参数+environ+getenv())

🏆个人主页:企鹅不叫的博客

​ 🌈专栏

  • C语言初阶和进阶
  • C项目
  • Leetcode刷题
  • 初阶数据结构与算法
  • C++初阶和进阶
  • 《深入理解计算机操作系统》
  • 《高质量C/C++编程》
  • Linux

⭐️ 博主码云gitee链接:代码仓库地址

⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!

💙系列文章💙


【Linux】第一章环境搭建和配置

【Linux】第二章常见指令和权限理解

【Linux】第三章Linux环境基础开发工具使用(yum+rzsz+vim+g++和gcc+gdb+make和Makefile+进度条+git)

【Linux】第四章 进程(冯诺依曼体系+操作系统+进程概念+PID和PPID+fork+运行状态和描述+进程优先级)


文章目录


💎一、概念补充

🏆1.进程竞争性

CPU资源等其他资源不够用,进程之间存在竞争性,所以出现了优先级

🏆2.进程独立性

一个进程是

内核结构task_truck+代码和数据

组成的,而linux系统是通过

进程地址空间

方式来保证进程的独立性

🏆3.并行

并行:多个进程在多个CPU下,同时运行

注意:多个进程都在系统中运行≠多个进程在系统中同时运行

🏆4.并发

大部分操作系统都是

分时

的,操作系统会给每一个进程赋予一个时间片,这样在一个调度周期中,可以调用到每一个需要运行的进程,多个进程在一个CPU下采用进程切换的方式,基于时间片轮转的多个进程看起来同时推进,称之为并发。

时间片:即CPU分配给各个进程的时间。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

🏆5.进程优先级管理

操作系统管理不同优先级的进程是用一个哈希桶管理,同一个优先级的进程在同一个桶中,其中操作系统会用 swap 函数交换新老进程进行迭代。

🏆6.进程间切换

CPU存在寄存器,这些寄存器储存了进程的临时数据

inttest(){int a =10;return a;}intmain(){int b =test();return0;}

a的值会先放入寄存器中,销毁了之后,再把寄存器里面的值赋值给b

在进程的

task_struct

结构体中,就有一个专门的成员用于保存进程的上下文数据

  • 上下文数据:进程在运行中产生的各种临时数据
  • 当进程被剥离的时候,需要保存上下文数据
  • 当进程恢复运行的时候,需要重新加载上下文数据

💎二、环境变量

🏆1.基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,它是系统中某些具有全局性质的变量,通常是为了满足某些系统的需求.

因为有环境变量的存在,运行系统指令如ls,不需要输入路径./

命令行变量就分为两种:普通变量和环境变量(全局),环境变量保存了程序相关的搜索路径,系统中的环境变量名叫 PATH,我们在 Linux 上可以通过 env 指令查看所有环境变量,那么 PATH 也是可以查出来的:

[Jungle@VM-20-8-centos:~]$ env | grep PATH
LD_LIBRARY_PATH=:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/Jungle/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
PATH=/home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin

我们可以查看PATH内容

[Jungle@VM-20-8-centos:~]$ echo $PATH
/home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin

🏆2.常见环境变量

USER:当前登录的用户
HOME:指定用户的主工作目录,即登录到 Linux 时的默认目录
LANG:当前的语言和编码设定
PATH:可执行命令的路径
SHELL:当前使用的命令行是什么,当前 shell ,通值就是 /usr/bash,使用shell时,默认环境变量是~/.bash_profile
LOGNAME:当前登录的用户名
PWD:当前所处路径
OLDPWD:上一个路径,使用cd -跳回上一个路径
HISTSIZE:系统会记录的历史命令条数

🏆3.查看环境变量-给PATH添加可执行文件

//echo $环境变量名 #查看环境变量[Jungle@VM-20-8-centos:~]$ echo $PATH
  //路径都以:作为分割/home/Jungle/.vscode-server/bin/d045a5eda657f4d7b676dedbfa7aab8207f8a075/bin/remote-cli:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/Jungle/.local/bin:/home/Jungle/bin

🏆4.环境变量命令

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

[Jungle@VM-20-8-centos:~]$ echo $HOME
/home/Jungle

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

//export PATH = $PATH:……[Jungle@VM-20-8-centos:~]$ export PATH=$PATH:/home/wxj/c22 linux/test 36//创建变量并且添加[Jungle@VM-20-8-centos:~]$ export aaaa=1234[Jungle@VM-20-8-centos:~]$ env | grep aaaa
aaaa=1234

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

4.unset: 清除环境变量

[Jungle@VM-20-8-centos:~]$ unset aaaa

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

🏆5.main函数三个参数介绍

mian 函数可以带参数,argc (命令个数,执行该可执行文件时传入的几个命令)、 char * argv[] (指针数组,存放了每一个命令的常量字符串)、char* env[](环境变量),其中char* env[]也是指针数组,每个程序会收到一个环境表,他就是这个指针数组,每个指针指向一个 ‘\0’ 结尾的环境字符串

在这里插入图片描述

介绍前两个参数应用

#include<stdio.h>#include<stdlib.h>//main函数可以带参数//第一个参数指代命令个数,执行该可执行文件时传入的几个命令//第二个参数是一个指针数组,存放了每一个命令的常量字符串intmain(int arg,char* argv[],char*envs[]){if(arg !=4){printf("Usage: %s [-a|-s|-m|-d] first second\n", argv[0]);return0;}int x =atoi(argv[2]);int y =atoi(argv[3]);if(strcmp("-a", argv[1])==0){printf("%d+%d=%d\n",x, y, x + y);}elseif(strcmp("-s", argv[1])==0){printf("%d-%d=%d\n",x, y, x - y);}elseif(strcmp("-m", argv[1])==0){printf("%d*%d=%d\n",x, y, x * y);}elseif(strcmp("-d", argv[1])==0&& y !=0){printf("%d/%d=%d\n",x, y, x / y);}else{printf("Usage: %s [-a|-s|-m|-d] first second\n", argv[0]);}return0;}

测试:

[Jungle@VM-20-8-centos:~/lesson12]$ ./main -m 103010*30=300[Jungle@VM-20-8-centos:~/lesson12]$ ./main -d 301030/10=3[Jungle@VM-20-8-centos:~/lesson12]$ ./main 1111 
Usage:./test [-a|-s|-m|-d] first second

介绍第三个参数应用

//第一个参数指代命令个数,执行该可执行文件时传入的几个命令//第二个参数是一个指针数组,存放了每一个命令的常量字符串//第三个参数用于导入环境变量!intmain(int arg,char* argv[],char*envs[]){for(int i =0;envs[i];i++){printf("envs[%d]: %s\n",i,envs[i]);}return0;}

🏆6.通过代码获取环境变量-environ

记得包含头文件< unistd.h >

externchar** environ;printf("get env from [environ]\n");for(int i =0; environ[i]; i++){printf("%d: %s\n", i, environ[i]);}

🏆7.通过系统调用获取或设置环境变量-getenv()

写一个只有我自己可以运行的文件

intmain(int arg,char* argv[],char*envs[]){char* user =getenv("USER");//依据环境变量名获取环境变量if(strcasecmp(user,"Jungle")!=0)//strcasecmp忽略大小写{printf("权限禁止!\n");return-1;}printf("成功执行!\n");return0;}

通过

getenv

函数获取到环境变量中的

USER

,判断其与我自己设定的user是否相同。如果不同就拒绝执行,相同才成功执行

🏆8.环境变量具有全局属性

  • 本地变量(局部)
  • 环境变量(全局)

所谓的本地变量,其实是bash内部定义的变量,bash内部的本地变量,并不会被这些子进程所继承。

而环境变量具有全局属性,可以被子进程继承并获取。


标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/YQ20210216/article/details/127429210
版权归原作者 企鹅不叫 所有, 如有侵权,请联系我们删除。

“【Linux】第五章 环境变量(概念补充+作用+命令+main三个参数+environ+getenv())”的评论:

还没有评论