当前位置: 首页 > news >正文

【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&#xff08;&#xff09;创建子进程 fork(void)的返回值有两种 注意fork&#xff08;&#xff09;头…...

美国访问学者生活中有哪些饮食文化特点?

美国的教育毋庸置疑&#xff0c;排在世界数一数二的位置&#xff0c;美食美景更是数不胜数&#xff0c;那么他们有哪些饮食习惯&#xff0c;下面51访学网小编为你们详细介绍这些内容吧。 一、美国饮食文化特点 1、美国的饮食文化体现科学、适度、快捷&#xff0c;以满足人体的…...

RxJava中的Subject

要使用Rxjava首先要导入两个包&#xff0c;其中rxandroid是rxjava在android中的扩展 implementation io.reactivex:rxandroid:1.2.1implementation io.reactivex:rxjava:1.2.0Subject Subject 既可以是一个 Observer 也可以是一个 Observerable&#xff0c;它是连接 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​)&#xff0c;坐标值是实数&#xff0c;且绝对值不超过 100.00&#xff0c;求围成的三角形周长。保留两位…...

企业什么要建设自有即时通讯软件系统

随着科技的不断发展&#xff0c;各种即时通讯软件也不断发展进步&#xff0c;而这也与企业的发展息息相关&#xff0c;因为每个人&#xff0c;每个企业都有属于自己的机密&#xff0c;属于自己的隐私。 钉钉&#xff0c;企业微信&#xff0c;等公有的即时通讯软件给企业带来便利…...

LocalDNS

目录 文章目录目录本节实战DNS优化1、dns 5s 超时问题解决办法2、NodeLocal DNSCache实验软件关于我最后本节实战 实战名称&#x1f498; 实战&#xff1a;NodeLocal DNSCache-2022.7.30(测试成功)&#x1f498; 实战&#xff1a;NodeLocal DNSCache-2023.2.21(测试成功) DNS优…...

线程池种类和拒绝策略

1、newCachedThreadPool()&#xff1a;可缓存的线程池&#xff0c;核心线程数量为0&#xff0c;最大线程数量为INT_MAX。线程空闲时间超过60秒被回收。适合处理大量小任务。 2、newFixedThreadPool()。固定线程个数的线程池&#xff0c;线程都是核心线程&#xff0c;没有应急线…...

Python制作9行最简单音乐播放器?不,我不满足

嗨害大家好鸭~我是小熊猫 好久不见啦~这次就来给大家整个大福利 ~ 源码资料电子书:点击此处跳转文末名片获取 最简单的9行代码音乐播放器如下&#xff1a; import time import pygamefile r歌曲路径 pygame.mixer.init() print(正在播放,file) track pygame.mixer.music.lo…...

零基础小白如何学会数据分析?

随着数字经济、大数据时代的发展&#xff0c;数据已然成为当下时代最重要的盈利资源&#xff0c;让企业在做决策和计划方案时更有针对性和依据&#xff0c;能提前预测市场发展方向&#xff0c;做好布局。由此而产生的数据分析岗位也逐渐被更多企业重视&#xff0c;特别是中大型…...

【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️小林爱敲代码       &#x1f6f0;️欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 目录&#x1f496;vim的基本概念vi…...

刷完这19道leetcode二分查找算法,不信进不了大厂

对于二分题&#xff0c;其实就是设定一个中间值 mid, 然后通过这个值进行一个判断 check(mid)&#xff0c; 通过这个函数的返回值&#xff0c;判断将不可能的一半剪切掉&#xff1b; 在刷题的时候需要注意主要是两部分&#xff0c;check 函数的定义以及边界的选择&#xff08;…...

四、Plugin Request and Sometimes pads

Request and Sometimes pads 到目前为止&#xff0c;我们只处理了总是可用的pad。然而&#xff0c;也有一些pad仅在某些情况下创建&#xff0c;或者仅在应用程序请求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. 基本概念&#xff1a;redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持…...

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后&#xff0c;夹爪看起来…...

坐标系概念 四元数 欧拉角

1、四个概念&#xff1a;“地理”坐标系、“机体”坐标系、他们之间换算公式、换算公式用的系数。地理坐标系&#xff1a;东、北、天&#xff0c;以下简称地理。在这个坐标系里有重力永远是&#xff08;0,0,1g&#xff09;&#xff0c;地磁永远是&#xff08;0,1,x&#xff09;…...

从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能

1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客 一、前言 在之前我们以及搭建好了基…...

K8s中gRpc通信负载均衡失效

上篇文章在做 整合K8sSpringCloudK8sSpringBootgRpc 时&#xff0c;发现K8s中使用gRpc通信&#xff0c;负载均衡功能失效查了下gRpc的最佳实践&#xff0c;找到这里Load balancingSome load balancers dont work effectively with gRPC. L4 (transport) load balancers operate…...

第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办

为持续推动分布式技术和产业创新发展&#xff0c;2023年2月17日&#xff0c;由杭州市人民政府指导&#xff0c;杭州市拱墅区人民政府、国家信息中心主办&#xff0c;中国移动通信集团有限公司、区块链服务网络&#xff08;BSN&#xff09;发展联盟承办&#xff0c;中国移动通信…...

用数字逻辑门复刻柏林钟:从二进制编码到硬件实现

1. 项目概述&#xff1a;用数字电路复刻“柏林钟”作为一个在柏林长大的孩子&#xff0c;我从小就对库达姆大街上的那座“柏林钟”着迷。它不像传统时钟那样用指针或数字告诉你时间&#xff0c;而是通过几排不同颜色的发光方块&#xff0c;以一种近乎艺术的方式呈现时间。这种独…...

第二周(第12周)

1.单电源供电的二阶低通滤波器2.功率放大电路...

Veo 2提示词性能瓶颈诊断:基于1726组AB测试的token敏感度热力图与阈值红线预警

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Veo 2提示词编写最佳实践总览 Veo 2 是 Google 推出的高性能视频生成模型&#xff0c;其对提示词&#xff08;prompt&#xff09;的语义精度、结构清晰度和上下文控制能力高度敏感。高质量提示词并非简单堆砌关…...

破解材料数据荒:合成数据与随机森林预测聚合物阻燃性能

1. 项目概述与核心挑战在材料研发领域&#xff0c;尤其是涉及公共安全的聚合物阻燃性研究&#xff0c;传统实验方法正面临巨大瓶颈。想象一下&#xff0c;你是一位材料工程师&#xff0c;需要设计一种用于高铁内饰或高层建筑电缆护套的新型聚合物&#xff0c;其阻燃性能必须满足…...

通过Taotoken实现Hermes Agent自定义模型供应商接入

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过Taotoken实现Hermes Agent自定义模型供应商接入 Hermes Agent是一个流行的AI智能体开发框架&#xff0c;它支持通过配置自定义…...

利用FTDI芯片MPSSE模式构建Arduino兼容开发环境

1. 项目概述&#xff1a;当FTDI芯片遇上Arduino生态如果你手头有一些闲置的FTDI USB转串口模块&#xff0c;比如常见的FT232R、FT2232H&#xff0c;或者像我一样&#xff0c;从某个旧设备上拆下来一块FT2232C的老古董&#xff0c;除了用来给单片机烧录程序或者做串口调试&#…...

机器学习与深度学习在社交媒体心理健康检测中的权衡与选择

1. 项目概述&#xff1a;当AI遇见心灵&#xff0c;社交媒体心理健康检测的技术十字路口在社交媒体成为我们数字生活延伸的今天&#xff0c;海量的文本数据无意中记录着用户的情感波动与心理状态。作为一名长期混迹于数据科学和自然语言处理&#xff08;NLP&#xff09;一线的从…...

Java网络编程基础分享

在学习 Java 的过程中&#xff0c;网络编程是非常重要的一环。无论是后端开发、分布式系统、即时通讯、文件传输&#xff0c;还是游戏服务、物联网设备&#xff0c;都离不开网络通信一、计算机网络基础1.1 什么是计算机网络把不同地理位置、具有独立功能的计算机&#xff0c;通…...

利用 Taotoken 多模型能力为智能客服场景提供备份路由

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用 Taotoken 多模型能力为智能客服场景提供备份路由 智能客服系统是许多企业与用户交互的关键入口&#xff0c;其响应能力和服务…...

Unity新手避坑指南:NavMesh烘焙参数(Agent Radius/Height)到底怎么设?附场景实测

Unity导航系统深度解析&#xff1a;Agent参数设置与场景适配实战在Unity游戏开发中&#xff0c;导航系统(Navigation System)是实现角色智能移动的核心模块。对于刚接触Unity导航系统的开发者来说&#xff0c;Agent Radius(代理半径)和Agent Height(代理身高)这两个参数的设置往…...