Linux 操作系统中的 main 函数参数和环境变量
在聊进程替换之前,有一些基础知识我们得先弄清楚。掌握了这些内容,不仅能让你更轻松地理解 Shell 是如何工作的,还能为之后的进程替换操作铺好路。进程替换说白了就是 Shell 的基本原理,它能把一个命令的输出直接当成另一个命令的输入来用。这背后,其实就是 Shell 在和操作系统打交道时,靠进程管理、命令参数解析以及路径管理等技巧实现的。
main函数参数介绍
刚学习c语言的时候,我们一定解除了很多main函数的形式,最后我们肯定是最多使用无参数类型的main函数,那么那些main函数里带参数的形式,到底是干什么的呢,有这些形式,肯定不是无用的。
int main(int argc,char* argv[])
argc
参数
argc
表示传递给程序的命令行参数的个数。这个参数不用传递,编译器会根据你输入的argv数组内参数的个数自动给出
argv
参数
argv
是一个字符指针数组,存储了传递给程序的命令行参数。argv[0] 通常是是程序的名称。
int main(int argc,char* argv[])
{cout << argc << endl;for (int i = 0; argv[i]; i++){cout << argv[i] << " ";}cout << endl;return 0;
}
我们可以很清楚的看出,参数被传递到了main函数里,那么也就是说,我们也可以通过对一个程序的参数传递让我们所写的程序运行不同的结果,这个跟shell的bash命令行输入的形式是不是很像,那么我们还有一个疑问,为什么我们输入的命令 比如 ls -a -l 这样的命令,并不需要我们使用路径来执行呢?这就需要提到Linux的环境变量了!
环境变量
查看环境变量
env
printenv
echo $PATH //查看特定的环境变量
这两个命令都可以让我们直接查看操作系统的环境变量,那么为什么我们使用的 ls 等命令不用我们使用路径来执行呢?
我们可以在环境变量里PATH下看到,我们所执行的ls命令的路径已经被添加到了PATH中,也就是说,当我们不使用路径去使用这些命令的时候,操作系统会直接在PATH下的路径中去查找这些程序,如果存在就可以直接执行,如果不存在就会报错。
同样,我们也可以使用路径来执行ls命令
我们直接输入的ls 命令有颜色的原因是shell这个外壳程序在进行命令解析的时候加上的 --color ,既然这样我们是不是也可以通过在PATH路径中加上我们程序所在的路径直接执行呢?当然可以
PATH=$PATH:/路径
这样我们就可以直接执行这个命令了
PATH通过:来分割路径,如果输错,问题不大,重启shell即可,我们当前对环境变量的操作只对这个打开shell有用,那么也就是说,每一次,我们打开shell启动Linux,都会重新生成环境变量,在root用户下, etc/profile 里保存的shell脚本就是每一次要执行的生成环境变量的程序,但是最上面的注释还是很重要的
我们可以尝试去看看这个文件,但千万不要去修改这个文件原有的内容,如果需要修改,我们可以通过加入需要执行的shell脚本来自定义。
环境变量内容
看我圈出来的内容,不正是命令行提示的信息
程序获取环境变量
既然我们已经可以获取命令行参数,那么我们应该如何获取环境变量并输出一个类似于shell程序的
呢?
int main(int argc,char* argv[],char* env[])
我们可以通过main函数参数直接获得,既然我们已经知道了我们所运行的程序就是BASH进程的子进程,子进程可以直接获得父进程的环境变量,就类似于C++缺省参数,也可以由我们父进程进行传递(子进程继承父进程的环境变量,父进程修改环境变量传递给子进程)。
int main(int argc,char* argv[],char* env[])
{for (int i = 0; env[i]; i++){cout << env[i] << endl;}cout << endl;return 0;
}
截了一部分
同时,系统调用接口也有:
char *getenv(const char *name); //获取特定的环境变量的值
类似于 echo $name , 返回环境变量的值(字符串),如果环境变量不存在,返回NULL。
int setenv(const char *name, const char *value, int overwrite);
//更改环境变量的值
- name:环境变量的名称。 value:要设置的值。overwrite:如果为非零值,则在环境变量已存在的情况下覆盖其值;如果为零,则保留原值。
int unsetenv(const char *name);//删除指定的环境变量
extern char **environ;
//environ 是一个全局变量,指向一个字符串数组,包含所有的环境变量。
我们也可以通过直接访问这个全局变量去获得所有环境变量。
仿写命令提示符
[zws@hcss-ecs-942f pipe_use]$
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;#define PWD_CUT "/"char* Username()
{return getenv("USER");
}char* getPwd()
{char *pwd = getenv("PWD");char *token = strtok(pwd, PWD_CUT); //将特定分隔符的字符串分开char *last_token;while (token != NULL){last_token = token; token = strtok(NULL, PWD_CUT); //必须先使用strtok分开一次,剩下的就不用传入字符串}return last_token;
}char* HostName()
{return getenv("HOSTNAME");
}int main()
{printf("[""%s@%s %s""]""#",Username(), HostName(), getPwd());cout << endl;return 0;
}
相关文章:

Linux 操作系统中的 main 函数参数和环境变量
在聊进程替换之前,有一些基础知识我们得先弄清楚。掌握了这些内容,不仅能让你更轻松地理解 Shell 是如何工作的,还能为之后的进程替换操作铺好路。进程替换说白了就是 Shell 的基本原理,它能把一个命令的输出直接当成另一个命令的…...

Vue项目中通过插件pxtorem实现大屏响应式
一、原理 rem单位代表的是根节点的font-size大小,所以当我们在页面上使用rem去替代px的时候,就可以通过修改根节点font-size的值,动态地让页面上的元素根据不同浏览器宽高下去实现变化。 二、工具 1.postcss-pxtorem 作用:在编…...

(Django)初步使用
前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架,适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档,使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…...

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)
前言 本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括但不限于:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三。 后面会经常写一下博客&…...

生信科研,教授(优青)团队一站式指导:高通量测序技术--农业植物基因组分析、组蛋白甲基化修饰、DNA亲和纯化测序、赖氨酸甲基化
组蛋白甲基化修饰工具(H3K4me3 ChIP-seq) 组蛋白甲基化类型也有很多种,包括赖氨酸甲基化位点H3K4、H3K9、H3K27、H3K36、H3K79和H4K20等。组蛋白H3第4位赖氨酸的甲基化修饰(H3K4)在进化上高度保守,是被研究最多的组蛋白修饰之一。 DNA亲和纯化测序 DNA亲…...

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据
文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件,并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…...

AI少女/HS2甜心选择2 仿逆水寒人物卡全合集打包
内含AI少女/甜心选择2 仿逆水寒角色卡全合集打包共6张 内含:白灵雪魅落霞飞雁君临华歌白君临华歌黑平野星罗晚香幽韵 下载地址: https://www.51888w.com/436.html 部分演示图:...

C/C++逆向:数据类型识别
在逆向工程中,数据类型识别是理解程序逻辑的重要步骤,因为它直接影响对程序逻辑和功能的理解,识别出数据类型有助于确定变量的含义和函数的行为。在分析恶意软件或者寻找安全漏洞时,识别数据类型能够帮助发现代码中的潜在问题。例…...

PASCAL VOC 2012数据集 20类物体,这些物体包括人、动物(如猫、狗、鸟等)、交通工具(如车、船、飞机等)以及家具(如椅子、桌子、沙发等)。
VOC2012数据集是PASCAL VOC挑战赛官方使用的数据集之一,主要包含20类物体,这些物体包括人、动物(如猫、狗、鸟等)、交通工具(如车、船、飞机等)以及家具(如椅子、桌子、沙发等)。每个…...
题目:最左边的数字
问题 - 1060 (hdu.edu.cn) 解题思路: 数字很大,使用科学计数法。则,我们需要的是a的整数位,最终求出a即可。 取对数:nlgnmlga,移项:lganlgn-m,接下来我们需要求m。 …...

第 4 章 Spring IoC容器之BeanFactory
Spring 的 IoC 容器是一个提供 IoC 支持的轻量级容器,除了基本的 IoC 支持,它作为轻量级容器还提供了 IoC 之外的支持。 Spring 提供了两种容器类型:BeanFactory 和 ApplicationContext: BeanFactory,基础类型 IoC 容…...
滚雪球学Oracle[2.3讲]:Oracle Listener配置与管理
全文目录: 前言一、Oracle Listener的基础概念1.1 什么是Oracle Listener?Listener的作用: 1.2 Oracle Listener的配置文件示例listener.ora配置文件: 1.3 启动与管理Listener 二、多Listener配置与负载分担2.1 多Listener的应用场…...

免费送源码:Javaspringboot++MySQL springboot 社区互助服务管理系统小程序 计算机毕业设计原创定制
摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受居民的喜爱,社区互助服务管理系统小程序被居民普遍使用,为…...

成都睿明智科技有限公司抖音电商新蓝海的领航者
在当今这个数字化浪潮汹涌的时代,电商行业正以惊人的速度迭代升级,而抖音电商作为新兴势力,更是凭借其庞大的用户基数、精准的算法推荐和高度互动的社区氛围,成为了众多商家竞相追逐的蓝海市场。在这片充满机遇与挑战的海洋中&…...

不可错过!CMU最新《生成式人工智能大模型》课程:从文本、图像到多模态大模型
1. 课程简介 从生成图像和文本到生成音乐和艺术,生成模型一直是人工智能的关键挑战之一。本课程将探讨推动生成模型和基础模型(Foundation Models)最近进展的机器学习和人工智能技术。学生将学习、开发并应用最先进的算法,使机器…...

重庆数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂
重庆作为西南地区的重要工业基地,正积极探索和实践数字孪生、工业互联网及可视化技术在智能制造领域的深度融合,致力于打造新型工业化智能制造工厂,为制造业的高质量发展注入强劲动力。 在重庆的智能制造工厂中,数字孪生技术被广…...
Qt QPushButton clicked信号浅析
前言 Qt 的 QPushButton clicked 信号原型: void clicked(bool checked false);通常,使用 Qt 的 QPushButton clicked 点击信号时,会以如下方式使用: connect(ui->pushButton, &QPushButton::clicked, this, [](){qDeb…...
Python时间戳转日期
在Python中,你可以使用datetime模块将时间戳转换为日期。时间戳通常是一个表示自1970年1月1日(UTC)以来的秒数的浮点数或整数。 以下是一个简单的示例,展示了如何将时间戳转换为日期和时间: import datetime# 示例时…...

对 LLM 工具使用进行统一
我们为 LLM 确立了一个跨模型的 统一工具调用 API。有了它,你就可以在不同的模型上使用相同的代码,在 [Mistral] 或 [Llama]) 等模型间自由切换,而无需或很少需要根据模型更改工具调用相关的代码。此外,我们还在 transformers 中新…...
webpack/vite的区别
Webpack和Vite都是前端开发中常用的构建工具,它们在多个方面存在显著的区别。以下是对这两个构建工具的详细比较: 一、基础概念与定位 Webpack Webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。它允许开发…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...