命令行参数和环境变量【Linux操作系统】

文章目录

命令行参数

命令行参数就是main函数的参数,有两个

①argc:int类型,表示argv的元素个数

②argv:char*类型的数组,存储字符串

命令行参数有什么用呢?


由上图得:
执行这个程序(code)的命令行中以空格分隔的字符串就会传入argv中进行存储

这样可以干什么呢?

所以可以在main函数里面直接根据argv接收到的内容,来分情况进行一些处理

我们常用的Linux指令的选项的功能,就是使用这样的方式进行实现的


main函数的参数是谁传递的?

子进程可以继承父进程的数据

所以我们写得程序运行时,也能继承shell(bash)解析出来的argc和argv

进程再以参数的形式传给main函数


环境变量

环境变量
一般是指在操作系统中用来指定操作系统运行环境的一些参数
通常通过shell传递给所有进程

shell自己的环境变量是从操作系统的配置文件里面读取出来的

shell再把读取出来的信息分析之后,再放入shell内部的全局的指针数组中

我们在命令行上执行的命令都是shell的子进程,绝大部分都是shell创建的子进程使用进程替换,搞出来的

父进程的环境变量表可以被子进程继承

并且可以把它作为参数传给main函数

也就是下图的env


环境变量的作用

环境变量的作用有很多,主要是看它里面存储了什么数据
环境变量因为是变量,所以可以存储任意全局数据,这些数据就可以被一些进程(或者全部进程)看到

如:

我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量中记录了动态库的路径帮助编译器进行查找。

环境变量在系统当中通常具有全局特性


简单介绍一下常见的环境变量

环境变量HOME:

作用:记录当前用户的家目录

bash的cwd是会跟着用户的工作路径的变化而变化的


环境变量PWD

记录当前用户的工作路径(用户的工作路径就是bash的cwd

pwd其实是从自己这个进程的PCB中读取cwd进行打印的


环境变量USER

记录当前登陆的用户是谁

我们可以通过这个环境变量和getenv函数,在进程中确定是谁在使用这个进程

就可以使用条件判断,分类讨论


上面这个代码形成的进程,就只有用户who能正常使用

其他用户,那片是root用户都不能正常使用


环境变量OLDPWD

记录用户最近的上一次所处的工作路径

这也是命令cd -的实现依据


环境变量相关指令和函数

函数:getenv

头文件:stdlib.h

参数:环境变量名

返回值类型:char*

作用:获取对应环境变量的值


函数:putenv

头文件:stdlib.h

参数:char*env(字符串),环境变量及其值

作用:更改环境变量或者把一个自定义的环境变量,加入自己的环境变量表

putenv加入环境变量之前,进程自己的环境变量表和父进程的环境表是同一张,是从父进程那里继承来的

putenv加入环境变量之后,会触发写时拷贝进程自己的环境变量表就是只属于自己和自己创建子进程的了,因为写时拷贝


查询所有的环境变量的指令:env


指令:set
查询所有的本地变量和环境变量


指令:export

export 本地变量名:可以把本地变量变成环境变量

export 变量名=值:可以直接把这个变量定义成环境变量


指令:unset

语法:unset 环境变量名
删除一个环境变量


全局变量:environ

是C语言默认就有的一个全局变量,可以用来获取环境变量

注意:使用前必须先使用extern声明这个变量,不然编译不能通过

类型:char**

=指向env数组的起始地址(注意不是指向env数组,因为它不是数组指针),这样它解引用就可以直接拿到环境变量==


本地变量

本地变量是给bash进程内部使用的

可以直接在命令行中定义变量,此时这个变量就是bash的本地变量

Linux中定义变量的方式统一是:变量名=值


OS为用户启动bash进程之后在内存中

①bash会读取配置文件之后搞出env环境变量表,用来所有存储环境变量

②读取启动子进程的命令(字符串),生成argv命令行参数表

③根据自己的需要,生成一张本地变量表,用来存储所有本地变量

所以本地变量变成环境变量
只需要把这个本地变量从本地变量表中删除,再放进环境变量表中就可以了


因为bash等shell中可以定义变量,也可以识别for,while等语法
所以shell也衍生出一门语言,也就是shell脚本


环境变量于本地变量的区别

环境变量能被子进程继承

bash的子进程再使用fork创建的子进程也能继承到bash的环境变量

它再继续使用fork再创建,还能继承

所以环境变量能被bash和以bash为源头衍生出的所有进程继承
所以环境变量具有全局属性

本地变量不能被子进程继承,只能在shell进程内部使用


环境变量为什么要具有全局属性?

因为环境变量本质是系统的配置信息
配置信息要生效,就必须是所有进程都遵守配置信息
但是进程遵守的前提是,进程能看到配置信息

所以环境变量必须具有全局属性,能让所以进程都能"看见"

进程之间具有独立性,但是有时候也需要信息交互

环境变量就是一种交互的方式

父进程可以通过环境变量,把一些信息传递给子进程[一般是只读数据]

相关推荐
哈哈幸运3 小时前
MySQL运维三部曲初级篇:从零开始打造稳定高效的数据库环境
linux·运维·数据库·mysql·性能优化
soulermax3 小时前
数字ic后端设计从入门到精通2(含fusion compiler, tcl教学)
java·linux·服务器
黑心老人3 小时前
Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
linux·运维·服务器·macos
Zenexus3 小时前
Linux学习笔记协议篇(六):SPI FLASH设备驱动
linux·笔记·arm
口嗨农民工3 小时前
ubuntu18.04启动不了修复
linux·运维·ubuntu
辣个蓝人QEX4 小时前
【ZYNQ MP开发】Linux下使用bootgen命令生成BOOT.bin报错架构不对问题探究
linux·arm开发·xilinx·zynq·mpsoc·bootgen·u-boot移植
Vesan,4 小时前
无人机飞控运行在stm32上的RTOS实时操作系统上,而不是linux这种非实时操作系统的必要性
linux·stm32·无人机
GalaxyPokemon5 小时前
Muduo网络库实现 [十六] - HttpServer模块
linux·运维·服务器·网络
Zfox_5 小时前
Git 进阶之路:高效协作之分支管理
大数据·linux·运维·c++·git·elasticsearch
夏天里的肥宅水6 小时前
解决方案:远程shell连不上Ubuntu服务器
linux·运维·服务器·ubuntu