Linux 进程(六) 环境变量

main函数参数:

        这是一个常见的main函数,那么main函数可以带参吗?

int main()
{return 0;
}

         答案是可以的!

        我们先看这样一段代码,首先给main函数带上两个参数。

        然后我们来看输出的结果。

        这样一组字符串是命令行解释器(bash)给我们输出的。

        后面是一串字符串,也就是命令行参数。

        bash 帮我们维护一个数组数组里面存储着我们输入的命令行参数的地址,bash读取命令行参数以空格为间隔,将这串字符传给main函数,也就造成了上面我们看见的情况。

        同时这段代码可以这样修改。

        同时也验证了argv[] 数组最后存储的是null,因为argv[i] == null 判断为假,循环结束。

        那么命令行参数有什么用呢?答命令行参数是Linux指令选项的基础。使得一个函数可以执行许多不同的功能。下面我们用命令行参数的形式来模拟一下±计算器。

        其实在Linux下,我们经常用一些命令行是带参数的 如 ls -l  ls -al 。

        比如在使用gcc命令时,gcc -o -E -S -c -g -static 这是都是相同的命令但使用其中不同的功能。

环境变量:

基本概念:

        环境变量(environment variables)一般是指在操作系统开辟的一块内存,用来指定操作系统运行环境的一些参数。
        如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
        环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

PATH环境变量:

       在Linux系统下,我们不难发现执行自己的可执行程序 需要 ‘./ ’ ,而执行ls 诸如此类的命令(也是可执行程序),却不需要 ‘./’ 这是为什么呢?这是因为系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。我们没有告诉他在当前路径下寻找,而且path中有没有就会报“-bash: myprocess: command not found”

        那么如何查看PATH呢? $PATH

        那么怎么样才能使自己自己的程序不需要加 ‘./ ’ 也能执行呢?将自己的可执行程序放到上面的路径下(每一个路径都已 ‘ : ’ 为分隔符),或者将自己可执行程序的路径放到PATH中。

        1.将自己的可执行程序放到上面的路径下   

        但是,将自己的可执行程序当到操作系统的目录下会污染系统内置的环境变量。所以不建议这么做。

2.或者将自己可执行程序的路径放到PATH中

        如果不小心改掉环境变量,那么关闭xshell 从新登录一下就行。

        还有一些环境变量时存储当前,路径,用户名,家目录的如:

环境变量一些特性:

        如何查看全局的环境变量呢? env 

         如何自己设置一个环境变量呢? export

        删除一个环境变量:unset 

         环境变量是由bash创建的那么是否可以传给main函数呢?答案是可以的,bash在创建子进程时,同时创建了两张表,一张命令行参数表,一场环境变量表,都传递给了其创建的子进程。

        代码:

        执行内容:

        可以得出main函数确实可以继承bash 的环境变量。

        那么父进程可以继承子进程的环境变量吗?答案是可以的。

        首先我们在全局自定义一个环境变量,看看子进程内是否有。

        修改代码。

        说明环境变量确实有全局性,并且子进程可以继承父进程的属性。

        如果要获得某给特定的环境变量呢?就要使用 getenv。

        代码:  

        

本地变量:

        本地变量不是环境变量,没有全局属性,同时也不会被子进程继承

        本地变量可以直接在命令行上定义,不需要像环境变量上加export。

        同时使用set 查看本地所有的变量,包括环境变量。

        unset取消本地变量和环境变量。

        来写一段代码验证一下,环境变量可以被继承,而本地变量却不可以。

         执行结果说明环境变量可以被继承,本地变量却不行,只能在本地(bash进程)使用。

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

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

相关文章

AUTOSAR软件手册文档缩写描述,AUTOSAR_TR_PredefinedNames

由于AUTOSAR文档中的缩写太多,入门者看起开不方便。例如TR、SWS、SRS、EXP模块。 下载链接:https://www.autosar.org/fileadmin/standards/R21-11/FO/AUTOSAR_TR_PredefinedNames.pdf

用邮件及时获取变更的公网IP--------python爬虫+打包成exe文件

参考获取PC机公网IP并发送至邮箱 零、找一个发送邮件的邮箱 本文用QQ邮箱为发送邮箱,网易等邮箱一般也有这个功能,代码也是通用的。 第一步:在设置中找到账户,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击获…

【MyBatis】配置 SQL 提示(IDEA 代码自动补全)和解决未能解析数据库 Unable to resolve table ‘employee‘ 问题

默认在 MyBatis 中编写 SQL 语句是不识别的。 需要做如下配置: 然后 SQL 语句可以出现提示,但是自己的数据库会报错: 原因是 IDEA 没有和 数据库 建立连接,需要连接数据库(注意:需要具体到某个 Schema&…

计算机毕业设计 SpringBoot的停车场管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表: 当初始化的时候,会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造,然后调用addAll方法将链表的节点都初始化…

什么是自动化测试?为啥要学自动化测试?

什么是自动化测试,接着对常用的自动化测试框架进行了对比分析,最后,介绍了如果将自动化测试框架Cypress运用在项目中。 一、自动化测试概述 为了保障软件质量,并减少重复性的测试工作,自动化测试已经被广泛运用。在开…

基于果蝇算法优化的Elman神经网络数据预测 - 附代码

基于果蝇算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于果蝇算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于果蝇优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具,一直被许多网友们所喜欢,使用简单、方便。 UltraISO官方下载地址:https://cn.ultrais…

如何删除K8S中的Pod

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

杨中科 .NET Core 第一部分.NET Standard

1)不讲C#基础语法和NET基础类库(不需要学过ASPNET等)。需要懂HTML、JavaScript、数据库等。后续会录制基础视频 2)使用Visual Studio 2019 .NET .NET Framework Windows 程序 .NET Core 跨平台程序 .NET Standard 上述两者 遵从的标准 .NET5 开始上述统称为 .NET 新建.NET Sta…

Unity中裁剪空间推导(使用FOV来调节)

文章目录 前言一、使用FOV代替之前使用的Size(h)1、我们可以把矩阵中使用到 h(高) 和 w(宽) 的部分使用比值替换掉。2、替换后 前言 在之前的文章中,我们控制透视相机使用的是SIze。但是,在透视相机中,我们使用的是FO…

线程的深入学习(一)

前言 前面文章讲述了线程的部分基本知识,这篇是对线程的深入学习,包含线程池,实现框架等。 1.学习如何使用Executor框架创建线程池。 2.并发工具类如CountDownLatch、CyclicBarrier等。 3.线程安全和并发集合: 4.学习如何使用Jav…