0


Linux:进程概念(四.main函数的参数、环境变量及其相关操作)

上次讲了:Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)


文章目录


1main()函数的参数

在编写C/C++代码,我们通常都不会写main()函数的参数,但是在Linux下,main函数是可以带参数的

main()

函数是 C 和 C++ 程序中的入口函数,通常用于表示程序的起始点。在 C 和 C++ 中,

main()

函数可以有两种不同的形式:

  1. 在标准的 C 语言中,main() 函数通常定义为:intmain(void)//我们一般什么都不写{// 函数体return0;}这种形式的 main() 函数没有参数,返回一个整数值作为程序的退出状态码。
  2. 在一些特定的环境中(如 UNIX/Linux 系统),main() 函数也可以带有两个参数,用于传递命令行参数:intmain(int argc,char*argv[]){// 函数体return0;}- argc 是一个整数,表示命令行参数的数量(包括程序名本身)(就是说,argc也是argv这个数组里元素个数)。- char *argv[]是一个字符数组;argv 是一个指向字符指针数组的指针,每个指针指向一个以 null 结尾的字符串,表示一个命令行参数。
#include<stdio.h>#include<unistd.h>#include<sys/types .h>intmain(int argc,char* argv[]){for(int i =0; i < argc; i++){printf("%s\n", argv[i]);}return0;}

在这里插入图片描述

1.1bash处理命令行

在这里插入图片描述

1.2利用上述性质,写一个计算器

#include<stdlib.h>#include<stdio.h>intmain(int argc,char* argv[]){if(argc ==4){int a =atoi(argv[2]);//字符串转intint b =atoi(argv[3]);//字符串转intif(strcmp(argv[1],"-add")==0){printf("%d+%d=%d\n", a, b, a + b);}elseif(strcmp(argv[1],"-sub")==0){printf("%d-%d=%d\n", a, b, a - b);}elseif(strcmp(argv[1],"-mul")==0){printf("%d*%d=%d\n", a, b, a * b);}else{printf("%d/%d=%d\n", a, b, a / b);}}else{printf("used wrongly:please ./code.c [add][sub][mul][div] num1 num2");return1;}return0;}

在这里插入图片描述

2.环境变量

2.1基本概念

  1. 环境变量不是一个,而是一大堆,彼此之间没有直接关系
  2. 环境变量是系统内置的,具有特殊用途的变量> 我们之前理解的变量都是跟编程语言强相关的,一个整型变量啊 之类的。定义变量的本质就是开辟空间,为了方便表述这篇空间,我们起个名字而已> > 我们的程序在运行期间,也能开辟空间> > 操作系统与bash都是用c语言写的,也能在运行时开辟空间。所以这些环境变量本质也是开辟的空间,给上名字和内容即可。本身自己的数据也能更改
  3. 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数****环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

2.2为什么要有环境变量(意义)

2.3常见的环境变量

**我们在运行程序时,一般使用

./myprograme

(相对路径,本目录下的myprog) 或者直接使用绝对路径。如果什么都不加,直接

myprograme

,是找不到的。但是使用系统的指令时,就能直接找的**

这是因为存在一个全局的环境变量:PATH

  1. PATH: 这个环境变量定义了系统在执行命令时查找可执行文件的路径。当你输入一个命令时,系统会在 PATH 中指定的路径下查找是否存在该命令的可执行文件,如果存在,则执行该命令。如果 PATH 中没有包含命令的可执行文件路径,则系统会提示“command not found”。(完美符合上面的情景)
  2. HOME: 这个环境变量指定了当前用户的主工作目录,也就是用户登录系统后所处的默认目录。当用户执行 cd 命令时,如果没有指定目标目录,则系统会切换到 HOME 目录。
  3. SHELL: 这个环境变量定义了当前用户所使用的 Shell。Shell 是用户与操作系统之间进行交互的界面,它解释并执行用户输入的命令。通常情况下,SHELL 的值为 /bin/bash,表示用户正在使用 Bash Shell。其他常见的 Shell 包括 /bin/sh/bin/zsh 等。

查看环境变量

echo指令—打印输出文本
echo

用于打印输出文本或变量的内容到标准输出(通常是终端)。基本语法:

echo [选项] [字符串/变量]

选项:

echo

可以接受一些选项来改变其行为,常见的选项包括:

  • -n:不换行输出。
  • -e:启用转义字符的解析,可以让 echo 打印一些特殊字符,如换行符 \n、制表符 \t 等。
  • -E:禁用转义字符的解析,将反斜杠 \ 作为普通字符处理。
PATH
echo$PATH

美元符号

$

通常用于引用环境变量的值,如果不加那只是把PATH当成字符串
在这里插入图片描述

那么当我们想直接用文件名就能执行我们自己的代码时,有两种方法:

  1. 把文件拷贝到PATH中路径的一个
  2. 把文件的路径添加到PATH中
PATH=自己代码路径:$PATH

如果不加

:PATH

,那么PATH会直接被覆盖,只有自己代码的路径

2.4环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量export[变量名]=[赋值]> 可以设置一个名为“变量名”的环境变量,并赋予其值为“赋值”
  3. env: 显示所有环境变量在这里插入图片描述
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
本地变量

直接使用

变量名=赋值

我们这样就能创建一个本地变量,本地变量不能继承。只能在bash里使用

在这里插入图片描述

可以使用unset清楚环境变量和本地变量

在这里插入图片描述

2.5代码获取环境变量

  1. 通过main函数的第三个参数(最多就三个啦,真的没有了)
#include<stdio.h>intmain(int argc,char* argv[],char* envp[]){printf("环境变量列表:\n");for(int i =0; envp[i]!=NULL; i++){printf("%s\n", envp[i]);}return0;}

数组的最后一个元素是一个空指针,用于表示环境变量数组的结束

在这里插入图片描述

  • 这张表也是有bash进行维护的,是bash传给我们的代码的。而我们代码的进程也是由bash创建的。所以,环境变量是可以被子进程继承下去的
  • 那如果代码使用fork()呢? 创建子进程时,代码共享。数据以写时拷贝的方式私有一份 。显然子进程也有环境变量
  • 所以环境变量有全局属性,可以被所有子进程继承下去

在这里插入图片描述

  1. 使用getenv()函数获取单个环境变量(最常用)
getenv

函数用于获取指定环境变量的值。它的原型定义在

<stdlib.h>

头文件中:

char*getenv(constchar*name);

参数

name

是要获取的环境变量的名称,函数返回该环境变量的值。如果环境变量不存在,则返回

NULL

#include<stdio.h>#include<stdlib.h>intmain(){char* path =getenv("USER");if(path !=NULL){printf("USER: %s\n", path);}else{printf("USER environment variable not found.\n");}return0;}
  1. 通过第三方变量environ获取

在 C 语言中,

environ

是一个全局变量,用于存储当前进程的环境变量。它通常定义在

<unistd.h>

头文件中。

environ

是一个指向字符串数组的指针,每个字符串都表示一个环境变量。

#include<stdio.h>#include<unistd.h>externchar** environ;intmain(){char** env = environ;while(*env !=NULL){printf("%s\n",*env);
        env++;}return0;}

**

extern

是 C 语言中的一个关键字,用于声明一个变量或函数,表明该变量或函数是在其他文件中定义的,当前文件中只是引用了它。**

**

extern char **environ;

表示声明了一个全局变量

environ

,并表明该变量在当前文件中并没有定义,而是在其他文件中定义的。**

在这里插入图片描述

2.6添加或者修改环境变量

putenv

是 C 语言中的一个库函数,它定义在

<stdlib.h>

头文件中。这个函数用于将字符串添加到环境变量中,或者修改已经存在的环境变量的值。

函数原型如下:

intputenv(constchar*string);

这里的

string

是一个指向以 null 结尾的字符串的指针,该字符串的格式应该是

name=value

,其中

name

是环境变量的名称,

value

是环境变量的值。

如果

string

指向的字符串成功添加到环境变量中,或者成功修改了已经存在的环境变量的值,那么

putenv

函数返回 0。如果发生错误,返回非零值。

注意,

putenv

函数会修改其参数指向的字符串。因此,如果你不希望原始字符串被修改,你应该传递一个字符串的副本给

putenv

。此外,由于

putenv

可能会修改环境变量,这可能会影响到程序中其他部分的行为,因此在多线程环境中使用时需要特别注意。

2.7 最一开始环境变量哪里来的

我们首先要知道:环境变量确实属于 shell 进程的上下文。当用户退出登录时,shell 进程会结束,从而导致环境变量也随之消失。每次重新登录后,新的 shell 进程会启动,并加载相应的配置文件(如

.bash_profile

.bashrc

等),从而重新设置环境变量,使其生效

在这里插入图片描述

这里也能解释为什么我们每次登陆时,都是进到用户对应的默认目录:这样才能读取到相应的.bash_profile文件


今天就到这里啦!!!

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/qq_74415153/article/details/139033951
版权归原作者 是Nero哦 所有, 如有侵权,请联系我们删除。

“Linux:进程概念(四.main函数的参数、环境变量及其相关操作)”的评论:

还没有评论