【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)发展联盟承办,中国移动通信…...

人工智能基础部分13-LSTM网络:预测上证指数走势
大家好,我是微学AI,今天给大家介绍一下LSTM网络,主要运用于解决序列问题。 一、LSTM网络简单介绍 LSTM又称为:长短期记忆网络,它是一种特殊的 RNN。LSTM网络主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题…...

内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南
EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求,网页对域名进行添加映射时,添加成功后会生成一个外网访问地址,在浏览器中输入外网访问地址,即可查看内网应用。无需开放端口,EasyNTS上云网关平台会向Ea…...

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

Tomcat的类加载机制
不遵循双亲委托 在JVM中并不是一次性地把所有的文件都加载到,而是按需加载,加载机制采用 双亲委托原则,如下图所示: BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器CustomClassLoad…...

【shell 编程大全】数组,逻辑判断以及循环
数组,逻辑判断以及循环1. 概述 大家好,我又来了。今天呢我们继续学习shell相关的知识。还是老样子我们先回顾下上一次【脚本交互 以及表达式】学习到的知识 登录shell 关联配置文件什么是子shellumask 修改默认权限read 基础表达式 简单计算表达式expr 计…...

Android13 Bluetooth更新
目录 Android 13 版本说明 LE Audio 代码更新 Android 12代码路径 Android 13代码路径 Android 13 版本说明 里面对蓝牙更新的描述较少,一出提到蓝牙的一...

手工测试混了5年,年底接到了被裁员的消息....
大家都比较看好软件测试行业,只是因为表面上看起来:钱多事少加班少。其实这个都是针对个人运气好的童人才会有此待遇。在不同的阶段做好不同阶段的事情,才有可能离这个目标更近,作为一枚软件测试人员,也许下面才是我们…...

Umi框架
什么是 umi umi 是由 dva 的开发者 云谦 编写的一个新的 React 开发框架。umi 既是一个框架也是一个工具,可以将它简单的理解为一个专注性能的类 next.js 前端框架,并通过约定、自动生成和解析代码等方式来辅助开发,减少开发者的代码量。 u…...

教你学git
前言 git是一种用于多人合作写项目。详细说明如下 文章目录前言什么是版本控制?什么是 Git?它就属于人工版本控制器版本控制工具常见版本控制工具怎么工作的?git 文件生命周期状态区域安装配置-- global检查配置创建仓库工作流与基本操作查看…...

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题
任务描述 错误出现出现过四五次,应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…...