【Linux】环境变量,命令行参数,main函数三个参数保姆教学

news2025/7/6 2:23:12

目录

 ☃️1.奇奇怪怪的现象和孤儿进程

 ☃️2.环境变量

☃️3.深刻理解main函数的前两个参数和命令行参数


☃️1.奇奇怪怪的现象和孤儿进程

首先回顾一下之前我们学过的fork()创建子进程

fork(void)的返回值有两种

注意fork()头文件是

 

运行一下代码 

 

 

 结果是

看起来没什么问题

下面我们定义一个全局变量gal,并且只在子进程修改gal的值

结果是

 

我们发现不对啊,明明在子进程我们都把全局变量修改过,但是看起来好像父进程的值依然不变,但是两个相同的值居然有一样的地址 

为了解释这个现象,我们看一段代码

创建子进程之后一段时间让父进程直接退出

 发现子进程的ppid=1,也就是父进程退出之后子进程被一号进程(os)领养

 我们把被领养的进程叫做孤儿进程

为什么父进程退出之后这个进程一定要被领养?

因为一个进程没人领养它,他就会一直处于僵尸状态,没人回收他

并且孤儿进程直接ctrl c杀不死,必须killall 进程名

 

 ☃️2.环境变量

为什么每次运行程序的时候要./  但是Linux下一切皆文件,ls这样简答的一条语句也是用程序写出来的,但是在执行命令的时候我们就直接ls?

因为系统里有环境变量

用echo $PATH  指令查看环境变量列表,该列表是以:为分割的若干子路径

 而找一下ls所在文件路径(which ls)

 有没有发现!!!

 所以很好解释上面的问题,因为ls命令所在路径(文件列表)在环境变量列表的路径中,而直接执行一个程序的前提是在环境变量的列表从左到右挨个子路径找到他,找不到就不能直接执行

如果我想把自己的进程路径添加到这个列表里

 所以我们好像发现可以解释很多的Linux现象

 在Linux中把可执行程序拷贝到系统默认的路径下让我们可以直接访问的方式 相当于Linux下的软件安装!!!!

此时直接运行程序不加./完全没问题

刚在用的指令查看了环境变量的路径

 

同样的指令还可以加上不同的环境变量 

 下面的指令用来记录当前正在使用Linux的用户是谁

 所以很好解决了之前说的 权限问题,为什么OS知道谁是普通用户谁是root

是这个USER的环境变量帮我们保存着用户姓名

那么如何查看其余的环境变量?

指令env

 

其中的HISTSIZE=3000  

用history指令查看历史指令

如果指令数量达到3000,那么OS会把最早的代码清理掉一条,方便存储新来的一条指令,一次下去保存最近的3000条指令

echo $HOME 保存当前登录用户的家目录

☃️3.深刻理解main函数参数和命令行参数

你知道main函数有参数吗?? 

 没错这三个参数我们都会逐一讲解

这个代码需要C99标准执行,并且从今往后我们再也不用像之前一样写目标文件和依赖文件名称

 红框内容完全可以被下面的代码代替,其实$@就是目标文件的符号表示 $^就是依赖文件的符号表示

 

 首先打印一下这个char* envp[],在C语言,我们知道这是一个指针数组,数组里面存放的指针

不管里面有多少有效数据吗,假设有40个,那么第41个就指向NULL

并且打印地址发现这里面的内容不就是刚才env查看到的环境变量吗!!!! 

 所以envp其实是一个表结构,是传递给进程的环境变量表

你以为你从来写代码没有接触环境变量,其实无时无刻不在使用!!!!!!

但是上面获取环境变量的打印方式太挫了

最主流的还是函数获取

char *getenv("环境变量名称");  获取失败返回NULL

他的头文件是#include <stdlib.h>

那么那么,用函数获取环境变量是不是意味着我们可以自己实现一个指令!!!!!

我们来自己实现一个pwd指令 

 运行一下 发现没什么问题

把可执行程序的名字改成我自己的pwd

然后按照前面说过的添加我的可执行程序到环境变量的列表中

 惊喜发现我们写了一条自己的指令,并且完全正确

 

当然我们也可以通过这个函数写一个系统墙相关的代码

这个代码就是只能wrt用户和root执行,否则不可以 

现在我把NAME改成“wr” 结果如下

结论:

1.环境变量就是内存级的一张表,这张表由用户在登录系统的时候进行给特定用户形成属于自己的环境变量表

之所以说他是内存级的表,是因为内存的数据在没被加载到内存之前,环境变量都是从系统的相关配置文件中读取来的,环境变量在shell内部维持

2.每一个 环境变量都有自己的用途,自己的特定应用场景

下面对main函数 其他参数解释

其实每个元素都是kv的,即,有自己的名字和内容

 这样把hello添加到环境变量中  env可以查到

但是

 

这样一个简单的变量没有export,就不能被env找到 

其实他的原理是这样的

 刚才的hi相当于非环境变量,不在表里

但是hello在环境变量表里

当我们export hello='1122'  相当于shell在其内部找到一块空间(没被占用的)

让这块空间的chao*不指向NULL了,改为指向hello的字符串

 如果空间不够了还会malloc一块内存

shell启动的时候,是从系统的配置文件中读取环境变量表然后初始化这张表

并且环境变量表可以被子进程继承下去——环境变量有全局属性

刚才的hi叫本地变量,只在shell内部有效,不可以被子进程继承

如果想让他变成环境变量,直接

不需要

 这次可以env找到 

 

 所以export的工作就是把本地的变量添加到环境变量表里

 

现在看

其实argv也是一张表,他的类型和envp一样

那么我们来看一下他是干什么的

  

好奇怪,好像我们输入什么选项他就把选项添加到自己的argv表里面了

 

所以命令行参数就是这整个字符串

argc表示的就是命令行参数的个数  argv就是命令行参数对应的多个子串起始地址的一张表

 那么命令行参数的意义就是下面的代码

 结果:

 也就是实现 -x 选项功能!!!!

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#:Krypton控件使用方法详解(第八讲) ——kryptonBreadCrumb

今天介绍的Krypton控件中的kryptonBreadCrumb&#xff0c;下面开始介绍这个控件的属性&#xff1a;首先要介绍的是RootItem属性和外观属性&#xff1a;RootItem属性组中包含属性如下&#xff1a;image属性&#xff1a;代表在文字对象的前方插入一个图片&#xff0c;属性值如下图…

多元化业务布局全面开花,松井股份有望步入高成长正轨

2022年&#xff0c;宏观经济下行压力加大、疫情反复不断、国内消费需求不足等诸多因素&#xff0c;导致国内涂料行业遭遇“至暗时刻”&#xff0c;企查查平台数据显示&#xff0c;2022年1-10月&#xff0c;破产重整、注销拍卖的涂料企业超过700家。2月11日&#xff0c;国内涂料…

使用 PyTorch+LSTM 进行单变量时间序列预测(附完整源码)

时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道&#xff0c;但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率&#xff0c;一年里一只股票的日收盘价&#xff0c;一年里某个城市每周发生的交通事故数。 在任何一段时间段内记…

代码随想录算法训练营第四天 | 链表理论基础、4. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

打卡第四天&#xff0c;因为科三前几天没有带电脑&#xff0c;现在重新补一下第四天的卡 今日任务 24. 两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#…

C++类和对象_02----对象模型和this指针

目录C对象模型和this指针1、成员变量和成员函数分开存储1.1、空类大小1.2、非空类大小1.3、结论2、this指针概念2.1、解决名称冲突2.2、在类的非静态成员函数中返回对象本身&#xff0c;可使用return *this2.3、拷贝构造函数返回值为引用的时候&#xff0c;可进行链式编程3、空…

Python加密算法种类以及开发场景中的运用

不用说火爆一时&#xff0c;全网热议的Web3.0区块链技术&#xff0c;也不必说诸如微信支付、支付宝支付等人们几乎每天都要使用的线上支付业务&#xff0c;单是一个简简单单的注册/登录功能&#xff0c;也和加密技术脱不了干系&#xff0c;本次我们耙梳各种经典的加密算法&…

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 原文&…

【C++】初识CC++内存管理

前言 我们都知道C&C是非常注重性能的语言&#xff0c;因此对于C&C的内存管理是每一个C/C学习者必须重点掌握的内容&#xff0c;本章我们并不是深入讲解C&C内存管理&#xff0c;而是介绍C&C内存管理的基础知识&#xff0c;为我们以后深入理解C&C内存管理做铺…

基于 U-Net 网络的遥感图像语义分割 完整代码+论文

一、研究目的U-Net 是一种由全卷积神经网络启发的对称结构网络&#xff0c;在医疗影像分割领域取得了很好的效果。 此次研究尝试使用 U-Net 网络在对多光谱遥感影像数据集上进行训练&#xff0c;尝试使用卷积神经网络自动分割出建筑&#xff0c;希望能够得到一种自动分割遥感影…

ElementUI分页的实现

官网地址&#xff1a;Element - The worlds most popular Vue UI framework 第一步&#xff1a;拷贝你喜欢的分页类型放在你的组件页面需要用到的分页位置 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-p…

1.JAVA-JDK安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;Java-Jdk&#xff1a;https://www.aliyundrive.com/s/JpV55xhVq2A提取码: j53y一、jdk下载&#xff1a;前往Oracle官网可免费下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 此处我下载的是jdk8&a…

【nas折腾篇】抉择吧,是入门还是放弃

2018年公司一位女同事问群晖的nas是否值得买。我一脸懵&#xff0c;以前给公司买云服务有采购nas盘&#xff0c;直接mount挂到服务器上当存储&#xff0c;但对于单独的nas服务器没有什么概念。一晃几年过去了&#xff0c;陆续刷到些nas服务的视频&#xff0c;周边朋友用nas的也…

nginx的介绍及源码安装

文章目录前言一、nginx介绍二、nginx应用场合三、nginx的源码安装过程1.下载源码包2.安装依赖性-安装nginx-创建软连接-启动服务-关闭服务3.创建nginx服务启动脚本4.本实验---纯代码过程前言 高可用&#xff1a;高可用(High availability,缩写为 HA),是指系统无中断地执行其功…

OSI七层模型与物理层与设备链路层

目录 协议 举例 OSI七层模型 理解七层模型 以下为OSI七层模型数据逐层封装和数据逐层解封的过程 TCP/IP参考模型 数据包的层层封装与层层拆包 各层的数据以及协议 封装所用的协议的数字表示形式 物理层 模拟信号 模拟信号特点 数字信号 数字信号特点 数据通信模…

【存储】etcd的存储是如何实现的(3)-blotdb

前两篇分别介绍了etcd的存储模块以及mvcc模块。在存储模块中&#xff0c;提到了etcd kv存储backend是基于boltdb实现的&#xff0c;其在boltdb的基础上封装了读写事务&#xff0c;通过内存缓存批量将事务刷盘&#xff0c;提升整体的写入性能。botldb是etcd的真正的底层存储。本…

CSS预处理器sass和less

文章目录CSS预处理器什么是CSS预处理器Sass和LESS背景介绍Sass背景介绍LESS的背景介绍Sass安装Sass下载Ruby安装文件安装Ruby安装Sass编译Sass命令行编译命令行编译配置选项四种编译排版演示nested 编译排版格式expanded 编译排版格式compact 编译排版格式compressed 编译排版格…

Ethernet-APL——过程自动化的新黄金标准

| Ethernet-APL为终客户和设备制造商带来益处 Ethernet-APL&#xff08;Advanced Physical Layer&#xff0c;高级物理层&#xff09;是一种两线制以太网物理层&#xff0c;它使用了由IEEE 802.3cg所定义的10BASE-T1L&#xff0c;并采用了新的工艺制造规定&#xff0c;因此构成…

2.21多线程

一.并发编程java实现并发编程的方式是多线程其他语言,主打的 并发编程并不一样Go 主要通过多协程的方式实现并发erlang 是通过actor模型实现并发JS 通过定时器和事件回调的方式实现并发二.多线程在java标准库,提供了一个Thread类,表示/操作线程Thread类可以视为Java标准库提供的…

CCNP350-401学习笔记(401-450题)

401、What is the function of vBond in a Cisco SDWAN deployment? A. initiating connections with SD-WAN routers automatically B. pushing of configuration toward SD-WAN routersC. onboarding of SDWAN routers into the SD-WAN overlay D. gathering telemetry dat…

易点天下基于 StarRocks 全面构建实时离线一体的湖仓方案

作者&#xff1a;易点天下数据平台团队易点天下是一家技术驱动发展的企业国际化智能营销服务公司&#xff0c;致力于为客户提供全球营销推广服务&#xff0c;通过效果营销、品牌塑造、垂直行业解决方案等一体化服务&#xff0c;帮助企业在全球范围内高效地获取用户、提升品牌知…