文章目录

  • ​​1.进程的内存空间布局​​
  • ​​(1)内核空间PCB与用户空间​​
  • ​​(2)用户空间的具体布局​​
  • ​​2.命令行参数​​
  • ​​3.环境变量表​​
  • ​​4.如何访问环境变量表?​​
  • ​​5.设置环境变量​​

1.进程的内存空间布局

(1)内核空间PCB与用户空间

  • 内核空间PCB

(3.7)进程与线程——进程环境_环境变量

  • 用户空间

(2)用户空间的具体布局

(3.7)进程与线程——进程环境_环境变量_02

2.命令行参数

(1)

  • 命令就是可执行文件,紧跟着的参数,各种文件名等:都是命令行参数,向进程进行传递
  • eg:ls [参数] <路径或文件名>
    ls –l /home
  • mkdir [参数] <目录名>
    mkdir -p /home/xiaokun/src
  • cp [参数] <源文件路径> <目标文件路径>
    cp –r /usr/local/src /root

(2)eg

  • mian函数是进程的入口函数,argc:向进程所传递的命令行参数的个数,argv:向进程所传递的命令行参数本身,可以将其当作字符串数组
  • 注意:可执行文件名本身也作为命令行本身,传递给进程的命令行参数
#include<stdio.h>
int main(int argc, char **argv)
{
int i;
for (i=0;i<argc;i++)
printf("Argument %d is %s./n", i, argv[i]);

return 0'
}
  • 假如上述代码编译为hello.0,在命令行中执行:
  • hello.0 a b c d e

3.环境变量表

  • 每个进程都会有自己的环境变量表(该表可以来自shell,也可以来自父进程的参数传递)
  • 通过全局的环境指针(environ)可以直接访问环境变量表(字符串数组)
头文件unistd.h
extern char **environ;
  • 环境变量字符串形式为“name=value”, name是环境变量名称, value为环境变量赋值

4.如何访问环境变量表?

  • 获取环境变量的方法
    直接通过environ变量指针访问环境表
    使用getenv函数
  • getenv函数用于获取环境变量值
头文件: stdlib.h
char* getenv(const char *name);
指定环境变量名称,返回环境变量字符串指针,若未找到则返回空指针
  • eg:getenv(PATH),返回的是:PATH=:/bin:/usr/bin\0这个字符串

5.设置环境变量

  • 一般不会通过environ变量指针来修改,而是用下面的POSIX API
  • 设置环境变量的三种方法:
putenv
setenv
unsetenv
  • putenv函数将环境变量字符串放入环境变量表中;若该字符串已经存在,则覆盖
头文件: stdlib.h
int putenv(char *str);
  • setenv:指定环境变量的名称,然后查找对应的环境变量字符串,将name设置为value
头文件: stdlib.h
int setenv(const char* name,const char* value, int rewrite);
setenv将指定环境变量的值设置为参数指定值(更改环境变量字符串)

若name已经存在
rewrite不等于0,则删除其原先的定义
rewrite等于0,则不删除其原先的定义
  • unsetenv
头文件: stdlib.h
int unsetenv(const char* name);
删除指定的环境变量字符串