LInux|命令行参数|环境变量

LInux|命令行参数|环境变量

  • 命令行参数
    • main的参数之argc,argv
    • 几个小知识
      • <font color=#0099ff size = 5 face="黑体">1.子进程默认能看到并访问父进程的数据
      • <font color=#4b0082 size = 5 face="黑体">2.命令行创建的程序父进程都是bash
  • 环境变量
    • 怎么才能让我们的命令和系统的一样?
  • 见见更多的环境变量
  • 自定义环境变量
  • 代码获取环境变量
    • environ 全局变量
    • main的第三个参数
    • getenv() 获得单个的环境变量
  • 内建命令

可能我们在最开始学c语言的时候会看到下面这种写法

命令行参数

int main(int argc char * argv)
{
//...
}

这种写法的参数什么意思了? main函数的参数其实是命令行参数


int main(int  argc, char* argv[])
{for (int i = 0; i < argc; i++){printf("argv[%d]->%s\n", i, argv[i]);}return 0;
}

在这里插入图片描述

我们在命令行里输入的都是字符串

main的参数之argc,argv

argv是一个数组,里面的元素是char* 的指针,这里char*的指针用来指向字符串。 argc是argv数组的元素个数
注意 argv 最后一个元素为空
我们可以根据 argc 和 argv 实现 同一个程序实现不同的选项

#include<string.h> 
#include<stdio.h>
int main(int  argc, char* argv[])
{if (argc != 2){printf("useage:[-a -b ]\n");return 1;}if (strcmp(argv[1], "-a") == 0){printf("this is function1\n");}else if (strcmp(argv[1], "-b") == 0){printf("this is function2\n");}else{printf("there is no this function\n");}return 0;
}

在这里插入图片描述


几个小知识

1.子进程默认能看到并访问父进程的数据

#include<string.h> 
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
int g_bal = 100;
int main( int  argc, char *argv[])
{printf("I am father process,pid:%d,getppid:%d ,g_bal:%d\n",getpid(),getppid(),g_bal);pid_t id = fork();sleep(5);if(id == 0 ){// childwhile(1){printf("I am child process,pid:%d,g_bal:%d\n",getpid(),g_bal);sleep(5);}}else {      while(1){printf("I am father process,pid:%d,g_bal:%d\n",getpid(),g_bal);sleep(5);}}return 0;   
}

这个代码的现象就是 子进程也能打印出100
在这里插入图片描述


2.命令行创建的程序父进程都是bash

我们多次 启动这个程序 可以看到 pid 不同但是ppid 却是相同的(可能有机器不一样 我的bash进程的pid是25663)bash其实就是命令行解释器,bash读了字符串之后交给了子进程。
在这里插入图片描述


环境变量

我们知道 ls 也是程序 为什么我写的程序要./才能运行 而ls这种不需要呢?当然我们也可以带绝对路径运行ls /usr/bin/ls Linux环境下存在一些全局的设置,告诉命令行解释器去哪些路径下找可执行程序 系统中很多配置,在我们登陆Linux的时候已经被加载到bash(内存)中了。 PATH环境变量,想打印它的内容必须上$

怎么才能让我们的命令和系统的一样?

方案一 我们可以把可执行文件拷贝到usr/bin目录下,这相当于把我们的程序安装到Linux系统里 我们不建议这么干 因为会污染指令集
在这里插入图片描述
方案二 我们可以修改PATH的值PATH=/home/lj/lesson13这相当于把PATH原来的值覆盖了,导致系统找不到ls等系统指令了但是不用担心,我们重新登陆Linux又恢复原来的样子了因为 bash 是从一个文件中读取的环境变量,我们这里修改的只是内存级的 那我们怎么才能保存原先的值呢? PATH=$PATH:/home/lj/lesson13 但是这样还是没修改文件,我们才能让他永久有效呢 修改家目录的.bash_profile文件
在这里插入图片描述

见见更多的环境变量

  • HOME 记录该用户的家目录
  • PWD 记录该用户所在的路径
  • SHELL 查看所用的哪种解释器
  • HISTSIZE 记录最新的1000条历史指令

如果我们想看更多的环境变量可以使用 env命令
我们如果想自己定义环境变量也是可以的


自定义环境变量

export 环境变量名 = 值
在这里插入图片描述
如果不加exportecho这样能查到但是没有导入在.bash_profile文件里则称为本地变量

代码获取环境变量

environ 全局变量

#include<string.h> 
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include <stdio.h>
int main(int argc, char *argv[])
{extern char ** environ;int i = 0;for(; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

这个运行出来和我们用env命令一样的 这表明bash的子进程也能读取到环境变量,则并不奇怪因为最开始环境变量在文件里,bash读到该进程中,子进程本来就能访问父进程里面的数据
为什么是char**?
因为每个数组元素是char * 要想指向这张环境变量表只能是char**
在这里插入图片描述

main的第三个参数

main函数默认会生成两张表一张是环境变量表另一张是命令行参数表

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}

getenv() 获得单个的环境变量

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}

在这里插入图片描述

内建命令

LInux中百分之八十的命令都是bash创建子进程执行的,剩下的命令相当于是bash内部的函数这称为内建命令 我们子进程新产生的数据 父进程是看不到的
我们的echo,export都是内建命令 正因为export没有创建bash的子进程才能将数据导给bash

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

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

相关文章

微分方程错题本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

【图像超分】论文精读:Image Super-Resolution Using Dense Skip Connections(SRDenseNet)

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related work2.1. S…

解释TCP和UDP之间的区别

解释TCP和UDP之间的区别 TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两种在网络中广泛使用的传输层协议&#xff0c;它们各自具有独特的特点和适用场景。下面将详细解释TCP和UDP之间的区别&#xff0c;并从多个维度进行对比。 连…

设计模式(4):建造者模式

一.场景 我们要建造一个复杂的产品,比如手机、电脑、汽车。这个复杂的产品的创建。有这样一个问题需要处理&#xff1a; 装配这些子组件是不是有个步骤问题&#xff1f; 实际开发中&#xff0c;我们所需要的对象构建时&#xff0c;也非常复杂&#xff0c;有很多步骤需要处理时…

【Qt】:信号与槽(二)

信号与槽 一.带参数的信号和槽二.信号与槽的多对多连接三.信号与槽的断开四.lamda表达式定义槽函数 一.带参数的信号和槽 Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载.此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.&#xff08;一致指的是类型一致&a…

【算法笔记】 树形DP算法总结

定义&#xff1a;树形DP也叫树状DP&#xff0c;即在树上进行的DP&#xff0c;是DP中较为复杂一类 1&#xff1a;主体 即like拓扑排序&#xff0c;从叶子节点向上更新其父节点&#xff0c;从而进行dp&#xff0c;确保先更新的子节点去更新其父节点&#xff0c;一般使用dfs形式…

mysql安装遇到的问题

最近mysql安装遇到了许多问题 这个界面是下载器界面&#xff0c;reconfigure是重新配置这个版本&#xff0c;要新安装要点add 进入这个界面选择对应的版本下载

面试题库二

1、简述TCP/IP的三次握手和四次挥手 TCP&#xff08;Transmission Control Protocol&#xff09;是一种可靠的、面向连接的传输层协议&#xff0c;用于在网络中传输数据。在建立连接和断开连接时&#xff0c;TCP 使用了三次握手和四次挥手来确保通信的可靠性和正确性。 三次握手…

【C语言】作用域规则

任何一种编程中&#xff0c;作用域是程序中定义的变量所存在的区域&#xff0c;超过该区域变量就不能被访问。C语言中有三个地方可以声明变量&#xff1a; 在函数或块内部的局部变量在所有函数外部的全局变量在形式参数的函数参数定义中 局部变量 在某个函数或块的内部声明的…

MySQL 数据库基础操作详解

文章目录 MySQL 数据库基础操作详解1. 基本概念2. 库的操作3. 表的操作4. 数据操作5. 示例示例一&#xff1a;创建表和插入数据示例二&#xff1a;查询数据示例三&#xff1a;更新数据示例四&#xff1a;删除数据 MySQL 数据库基础操作详解 MySQL 是一种常用的关系型数据库管理…

【目录整理】(五)

​​​​​Git 基础 Git 详细安装教程文章浏览阅读10w次&#xff0c;点赞9.6k次&#xff0c;收藏1.7w次。Git 是个免费的开源分布式版本控制系统&#xff0c;下载地址为git-scm.com 或者 gitforwindows.org&#xff0c;本文介绍 Git-2.40.0-64-bit.exe 版本的安装方法&#x…

京准 | NTP网络时钟系统(子母钟系统)设计与答疑

京准 | NTP网络时钟系统&#xff08;子母钟系统&#xff09;设计与答疑 京准 | NTP网络时钟系统&#xff08;子母钟系统&#xff09;设计与答疑 子母钟系统&#xff0c;顾名思义就是由1/2套母钟和一群子钟组成。如果你选择了安徽京准公司的HR系列时钟系统产品&#xff0c;那么…

python电商结合双轨制

最近又重新整合翻看以前的数据&#xff0c;图片&#xff0c;绘画&#xff0c;还有各种编程代码&#xff0c;python,leetcode,还有关于商业方面的一些见解,想起了大学时候和同学们并肩作战&#xff0c;熬夜编码的时光。还有大数据&#xff0c;八爪鱼爬虫。 下面是我的手稿电商打…

算法学习——LeetCode力扣动态规划篇9

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

JavaSE day16笔记 - string

第十六天课堂笔记 学习任务 Comparable接口★★★★ 接口 : 功能的封装 > 一组操作规范 一个抽象方法 -> 某一个功能的封装多个抽象方法 -> 一组操作规范 接口与抽象类的区别 1本质不同 接口是功能的封装 , 具有什么功能 > 对象能干什么抽象类是事物本质的抽象 &…

2536. 子矩阵元素加 1

跳转题目 本题暴力可以做&#xff0c;猜到用差分&#xff0c;但是不熟&#xff0c;不知道二维差分怎么用&#xff0c;碰到用差分的题目太少了。 暴力算法&#xff1a; class Solution { public:vector<vector<int>> rangeAddQueries(int n, vector<vector<…

Docker 部署 FRP 内网穿透 实现端口映射

Frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 官网地址&#xff1a;https://github.com/fatedier/frp 准备工作…

数据结构算法刷题笔记——题型解法

数据结构算法刷题笔记——题型解法 一、常用容器1.1 vector1.1.1 vector基本操作1.1.1.0 头文件#include<vector>1.1.1.1 构造一个vector容器1.1.1.2 元素访问1.1.1.3 元素个数 .size()1.1.1.4 最大容量 .capacity()1.1.1.5 改变容器有效元素个数 .resize(n)1.1.1.6 改变…

STM32 | PWM脉冲宽度调制(第五天按键中断,控制电机正/反转、加速、减速、暂停与继续源码解析)

​ STM32 | PWM脉冲宽度调制(第五天)STM32 | PWM脉冲宽度调制(第五天呼吸灯源码解析)STM32 | PWM脉冲宽度调制(第五天电机速度控制源码解析)PWM 技术在以下其他机器学习领域和应用中也可以发挥作用: 自然语言处理 (NLP):调节文本生成模型(例如 GPT-3)的输出长度和多样…

NFT-前端开发(一)

使用 在我们想要保存项目的目录下打开终端运行npx create-react-app test2命令初始化&#xff0c;test2是我们的项目名字&#xff0c;可以自己去更改。 初始化完成后&#xff0c;我们目录下就会多出一个test2文件夹 &#xff0c;然后我们在vscode中打开该文件夹 然后我们打开j…