兜兜零元 发表于 2024-6-29 11:45:04

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

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


1main()函数的参数

   在编写C/C++代码,我们通常都不会写main()函数的参数,但是在Linux下,main函数是可以带参数的
main() 函数是 C 和 C++ 步伐中的入口函数,通常用于表示步伐的起始点。在 C 和 C++ 中,main() 函数可以有两种差别的形式:

[*] 在标准的 C 语言中,main() 函数通常界说为:
int main(void) //我们一般什么都不写
{
    // 函数体
    return 0;
}
这种形式的 main() 函数没有参数,返回一个整数值作为步伐的退出状态码。
[*] 在一些特定的环境中(如 UNIX/Linux 体系),main() 函数也可以带有两个参数,用于传递命令行参数:
int main(int argc, char *argv[])
{
    // 函数体
    return 0;
}


[*]argc 是一个整数,表示命令行参数的数量(包括步伐名本身)(就是说,argc也是argv这个数组里元素个数)。
[*]char *argv[]是一个字符数组;argv 是一个指向字符指针数组的指针,每个指针指向一个以 null 结尾的字符串,表示一个命令行参数。

#include<stdio.h>
#include<unistd.h>
#include<sys/types .h>
int main(int argc, char* argv[])
{
        for (int i = 0; i < argc; i++)
        {
                printf("%s\n", argv);
        }
        return 0;
}
https://img-blog.csdnimg.cn/direct/25abd56cee8441f183412ae682468a20.png
1.1bash处理命令行

https://img-blog.csdnimg.cn/direct/264515975c1e4069b403a6735a433a8c.png
1.2利用上述性质,写一个计算器

#include<stdlib.h>
#include<stdio.h>
int main(int argc, char* argv[])
{
    if (argc == 4)
    {
      int a = atoi(argv);//字符串转int
      int b = atoi(argv);//字符串转int

      if (strcmp(argv, "-add") == 0)
      {
            printf("%d+%d=%d\n", a, b, a + b);
      }
      else if (strcmp(argv, "-sub") == 0)
      {
            printf("%d-%d=%d\n", a, b, a - b);
      }
      else if (strcmp(argv, "-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 num1 num2");
      return 1;
    }
    return 0;
}
https://img-blog.csdnimg.cn/direct/0318de87318547529a65db51a56c1fdf.png
2.环境变量

2.1基本概念


[*] 环境变量不是一个,而是一大堆,相互之间没有直接关系
[*] 环境变量是体系内置的,具有特殊用途的变量
       我们之前理解的变量都是跟编程语言强干系的,一个整型变量啊 之类的。界说变量的本质就是开发空间,为了方便表述这篇空间,我们起个名字而已
    我们的步伐在运行期间,也能开发空间
    操作体系与bash都是用c语言写的,也能在运行时开发空间。以是这些环境变量本质也是开发的空间,给上名字和内容即可。本身自己的数据也能更改
[*] 环境变量(environment variables)一样平常是指在操作体系中用来指定操作体系运行环境的一些参数
环境变量通常具有某些特殊用途,还有在体系当中通常具有全局特性
2.2为什么要有环境变量(意义)

2.3常见的环境变量

   我们在运行步伐时,一样平常使用./myprograme(相对路径,本目次下的myprog) 或者直接使用绝对路径。如果什么都不加,直接myprograme,是找不到的。但是使用体系的指令时,就能直接找的
这是由于存在一个全局的环境变量:PATH

[*] PATH: 这个环境变量界说了体系在执行命令时查找可执行文件的路径。当你输入一个命令时,体系会在 PATH 中指定的路径下查找是否存在该命令的可执行文件,如果存在,则执行该命令。如果 PATH 中没有包罗命令的可执行文件路径,则体系会提示“command not found”。(完美符合上面的情景)
[*] HOME: 这个环境变量指定了当前用户的主工作目次,也就是用户登录体系后所处的默认目次。当用户执行 cd 命令时,如果没有指定目标目次,则体系会切换到 HOME 目次。
[*] 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当成字符串
https://img-blog.csdnimg.cn/direct/87fec712c6b34ee9910aca3f32f25e2a.png
    那么当我们想直接用文件名就能执行我们自己的代码时,有两种方法:

[*] 把文件拷贝到PATH中路径的一个
[*] 把文件的路径添加到PATH中
PATH=自己代码路径:$PATH
   如果不加:PATH,那么PATH会直接被覆盖,只有自己代码的路径
    2.4环境变量干系的命令


[*] echo: 体现某个环境变量值
[*] export: 设置一个新的环境变量
export [变量名]=[赋值]
       可以设置一个名为“变量名”的环境变量,并赋予其值为“赋值”
[*] env: 体现所有环境变量
https://img-blog.csdnimg.cn/direct/3851eba3580f433eb88398660ccb0deb.png
[*] unset: 扫除环境变量
[*] set: 体现本地界说的shell变量和环境变量
本地变量

直接使用
变量名=赋值
   我们如许就能创建一个本地变量,本地变量不能继承。只能在bash里使用
https://img-blog.csdnimg.cn/direct/fa88b61277e34f04babc9a2034c9ce23.png
可以使用unset清晰环境变量和本地变量
https://img-blog.csdnimg.cn/direct/6186c0128b714fa3b6fbf928d66bd541.png
2.5代码获取环境变量


[*]通过main函数的第三个参数(最多就三个啦,真的没有了)
#include <stdio.h>

int main(int argc, char* argv[], char* envp[])
{
    printf("环境变量列表:\n");
    for (int i = 0; envp != NULL; i++)
    {
      printf("%s\n", envp);
    }
    return 0;
}
   数组的最后一个元素是一个空指针,用于表示环境变量数组的结束
https://img-blog.csdnimg.cn/direct/b7a5b7a23be444198c8f7847d6507e90.png
   

[*] 这张表也是有bash举行维护的,是bash传给我们的代码的。而我们代码的进程也是由bash创建的。以是,环境变量是可以被子进程继承下去的
[*] 那如果代码使用fork()呢? 创建子进程时,代码共享。数据以写时拷贝的方式私有一份 。显然子进程也有环境变量
[*] 以是环境变量有全局属性,可以被所有子进程继承下去
https://img-blog.csdnimg.cn/direct/c13df48c9be04365a8f1c69fd0dbc35b.png

[*]使用getenv()函数获取单个环境变量(最常用)
getenv 函数用于获取指定环境变量的值。它的原型界说在 <stdlib.h> 头文件中:
char *getenv(const char *name);
参数 name 是要获取的环境变量的名称,函数返回该环境变量的值。如果环境变量不存在,则返回 NULL。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char* path = getenv("USER");
    if (path != NULL)
    {
      printf("USER: %s\n", path);
    }
    else
    {
      printf("USER environment variable not found.\n");
    }
    return 0;
}

[*]通过第三方变量environ获取
在 C 语言中,environ 是一个全局变量,用于存储当前进程的环境变量。它通常界说在 <unistd.h> 头文件中。environ 是一个指向字符串数组的指针,每个字符串都表示一个环境变量。
#include <stdio.h>
#include <unistd.h>

extern char** environ;

int main()
{
    char** env = environ;
    while (*env != NULL)
    {
      printf("%s\n", *env);
      env++;
    }
    return 0;
}
   extern 是 C 语言中的一个关键字,用于声明一个变量或函数,表明该变量或函数是在其他文件中界说的,当前文件中只是引用了它。
extern char **environ; 表示声明白一个全局变量 environ,并表明该变量在当前文件中并没有界说,而是在其他文件中界说的。
https://img-blog.csdnimg.cn/direct/38bb4e42ab55432487c05046855f3adb.png
2.6添加或者修改环境变量

putenv 是 C 语言中的一个库函数,它界说在 <stdlib.h> 头文件中。这个函数用于将字符串添加到环境变量中,或者修改已经存在的环境变量的值。
函数原型如下:
int putenv(const char *string);
这里的 string 是一个指向以 null 结尾的字符串的指针,该字符串的格式应该是 name=value,此中 name 是环境变量的名称,value 是环境变量的值。
如果 string 指向的字符串成功添加到环境变量中,或者成功修改了已经存在的环境变量的值,那么 putenv 函数返回 0。如果发生错误,返回非零值。
注意,putenv 函数会修改其参数指向的字符串。因此,如果你不希望原始字符串被修改,你应该传递一个字符串的副本给 putenv。别的,由于 putenv 大概会修改环境变量,这大概会影响到步伐中其他部门的运动,因此在多线程环境中使用时需要特殊注意。
2.7 最一开始环境变量哪里来的

我们首先要知道:环境变量确实属于 shell 进程的上下文。当用户退出登录时,shell 进程会结束,从而导致环境变量也随之消失。每次重新登录后,新的 shell 进程会启动,并加载相应的配置文件(如 .bash_profile、.bashrc 等),从而重新设置环境变量,使其生效
https://img-blog.csdnimg.cn/direct/e84d46041ae841e5af768c7e037baeef.png
   这里也能解释为什么我们每次登陆时,都是进到用户对应的默认目次:如许才气读取到相应的.bash_profile文件
今天就到这里啦!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux:进程概念(四.main函数的参数、环境变量及其干系操作)