环境变量&进程程序替换

环境变量

      环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。 如:我们在编写C/C++代码时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

本地变量

        只能在当前进程使用。

环境变量 

        在当前进程及其子进程中使用,环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

常见环境变量:

PATH* :指定命令的搜索路径

HOME*:  指定用户的主工作目录(即用户登录到Linux系统时,默认的目录)

HISTSIZE* : 指保存历史命令记录的条数

SHELL*:当前Shell, 它的值通常是/bin/bash

环境变量的组织方式

每个程序都会受到一张环境表,环境表是一个字符指针数组,每个指针指向一个以‘\0’结尾的环境字符串

如何获取环境变量

方法1:命令行第三个参数

运行结果:

方法2:通过第三方变量environ获取

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时,要用extern声明。

方法3:系统调用获取或环境变量

       常用putenv和getenv函数来访问特定的环境变量。

注:环境变量通常具有全局属性,可以被子进程继承下去

进程程序替换

替换原理

    用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

注:exec函数族的函数只是用磁盘上的一个新程序替换了当前进程的正文段、数据段、堆和栈,其他的并没有改变。

替换函数

   注:这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。如果调用出错则返回-1. 所以exec函数只有出错的返回值而没有成功的返回值。

这六个函数中,execve属于系统调用函数,其他函数是在execve函数基础上经过包装而形成的库函数。它们的关系图如下:

那我们又如何区分这些函数呢?

  1. 首先,这六个函数全部都已exec四个字符开头。
  2. 函数名中含字符’l’的不会含字符’v’,它们的区别是函数名中含有‘l’的表示列举参数,意思就是如果我们要调用”ls -al”指令,就需要将所有参数通过字符串的形式列举出来,即arg=“ls”,”-a”,”-l”,NULL;函数名中含有‘v’表示参数向量表,意思是我们要把参数写在一个指针数组中,例如上面的“ls -al”,我们可以定义一个指针数组char* const agr[]={“ls”,”-a”,”-l”,NULL,}然后向含有字符’v’的函数名的函数传参;我们需要注意的是不管是列举参数,还是参数向量表,最后一个参数都必须是NULL
  3. 还有一个区别是字符’p’,函数名含有字符’p’的函数不需要指定路径(绝对路径和相对路径都可以),exec函数会通过PATH环境变量在指定的各目录中搜寻可执行文件;而不含字符’p’的函数需要指定可执行文件的路径。
  4. 最后一个区别是字符’e’,函数名的最后一个字符是‘e’的函数可以接收一个指向环境字符串指针数组的指针,而其他的函数则使用调用进程中的environ变量为新程序复制现有进程的环境变量

exec调用举例:

猜你喜欢

转载自blog.csdn.net/smile_zhangw/article/details/81813592