【Linux】环境变量,命令行参数,main函数三个参数保姆教学
目录
☃️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 选项功能!!!!
相关文章:
【Linux】环境变量,命令行参数,main函数三个参数保姆教学
目录 ☃️1.奇奇怪怪的现象和孤儿进程 ☃️2.环境变量 ☃️3.深刻理解main函数的前两个参数和命令行参数 ☃️1.奇奇怪怪的现象和孤儿进程 首先回顾一下之前我们学过的fork()创建子进程 fork(void)的返回值有两种 注意fork()头…...
美国访问学者生活中有哪些饮食文化特点?
美国的教育毋庸置疑,排在世界数一数二的位置,美食美景更是数不胜数,那么他们有哪些饮食习惯,下面51访学网小编为你们详细介绍这些内容吧。 一、美国饮食文化特点 1、美国的饮食文化体现科学、适度、快捷,以满足人体的…...
RxJava中的Subject
要使用Rxjava首先要导入两个包,其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0Subject Subject 既可以是一个 Observer 也可以是一个 Observerable,它是连接 Observer 和…...
vue-element-admin在git 上 clone 之后无法install
一. 无法install的原因因为vue-element-admin引入的富文本编辑插件所导致 由于tui-editor变更 名字 导致 依赖查询找不到对应的版本二. 解决的办法先删掉package.json中tui-editor:1.3.3找到 \src\components\MarkdownEditor\index.vue 把所有的import 替换成下面4个import cod…...
Linux线程调度实验
Linux线程调度实验 1.获取线程属性 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <pthread.h> #include <time.h> #include <stdlib.h> #include <errno.h> #define _GNU_SOURCE#define handle_error…...
洛谷P5735 【深基7.例1】距离函数 C语言/C++
【深基7.例1】距离函数 题目描述 给出平面坐标上不在一条直线上三个点坐标 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_3)(x1,y1),(x2,y2),(x3,y3),坐标值是实数,且绝对值不超过 100.00,求围成的三角形周长。保留两位…...
企业什么要建设自有即时通讯软件系统
随着科技的不断发展,各种即时通讯软件也不断发展进步,而这也与企业的发展息息相关,因为每个人,每个企业都有属于自己的机密,属于自己的隐私。 钉钉,企业微信,等公有的即时通讯软件给企业带来便利…...
LocalDNS
目录 文章目录目录本节实战DNS优化1、dns 5s 超时问题解决办法2、NodeLocal DNSCache实验软件关于我最后本节实战 实战名称💘 实战:NodeLocal DNSCache-2022.7.30(测试成功)💘 实战:NodeLocal DNSCache-2023.2.21(测试成功) DNS优…...
线程池种类和拒绝策略
1、newCachedThreadPool():可缓存的线程池,核心线程数量为0,最大线程数量为INT_MAX。线程空闲时间超过60秒被回收。适合处理大量小任务。 2、newFixedThreadPool()。固定线程个数的线程池,线程都是核心线程,没有应急线…...
Python制作9行最简单音乐播放器?不,我不满足
嗨害大家好鸭~我是小熊猫 好久不见啦~这次就来给大家整个大福利 ~ 源码资料电子书:点击此处跳转文末名片获取 最简单的9行代码音乐播放器如下: import time import pygamefile r歌曲路径 pygame.mixer.init() print(正在播放,file) track pygame.mixer.music.lo…...
零基础小白如何学会数据分析?
随着数字经济、大数据时代的发展,数据已然成为当下时代最重要的盈利资源,让企业在做决策和计划方案时更有针对性和依据,能提前预测市场发展方向,做好布局。由此而产生的数据分析岗位也逐渐被更多企业重视,特别是中大型…...
【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️欢迎关注:👍点赞🙌收藏✍️留言 目录💖vim的基本概念vi…...
刷完这19道leetcode二分查找算法,不信进不了大厂
对于二分题,其实就是设定一个中间值 mid, 然后通过这个值进行一个判断 check(mid), 通过这个函数的返回值,判断将不可能的一半剪切掉; 在刷题的时候需要注意主要是两部分,check 函数的定义以及边界的选择(…...
四、Plugin Request and Sometimes pads
Request and Sometimes pads 到目前为止,我们只处理了总是可用的pad。然而,也有一些pad仅在某些情况下创建,或者仅在应用程序请求pad时创建。第一个有时被称为a;第二个被称为请求pad。pad的可用性(always, sometimes or request)可以在pad的…...
唤醒手腕 Java 后端 Springboot 结合 Redis 数据库学习笔记(更新中)
Redis 基本介绍 Redis Introduction The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 基本概念:redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持…...
robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动
robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后,夹爪看起来…...
坐标系概念 四元数 欧拉角
1、四个概念:“地理”坐标系、“机体”坐标系、他们之间换算公式、换算公式用的系数。地理坐标系:东、北、天,以下简称地理。在这个坐标系里有重力永远是(0,0,1g),地磁永远是(0,1,x)…...
从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能
1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客 一、前言 在之前我们以及搭建好了基…...
K8s中gRpc通信负载均衡失效
上篇文章在做 整合K8sSpringCloudK8sSpringBootgRpc 时,发现K8s中使用gRpc通信,负载均衡功能失效查了下gRpc的最佳实践,找到这里Load balancingSome load balancers dont work effectively with gRPC. L4 (transport) load balancers operate…...
第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办
为持续推动分布式技术和产业创新发展,2023年2月17日,由杭州市人民政府指导,杭州市拱墅区人民政府、国家信息中心主办,中国移动通信集团有限公司、区块链服务网络(BSN)发展联盟承办,中国移动通信…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
