1. Task 1
先使用 env 查看环境变量如下图所示
再使用 export MY123=456 设置环境变量MY123为456,如下
此时查看环境变量,可以找到名为MY123的环境变量
再运行unset MY123进行清除
此时查看环境变量,已经找不到了名为 MY123 的环境变量
原因分析: export 和 unset 都是shell自身的命令,操作的是shell变量,而使用export命令设置的shell变量会被shell传递到子进程中, 所以shell fork得到的子进程env 能看到export命令设置的环境变量,而unset清除之后就不会再传递过去,所以就看不到了。
2. Task 2
示例代码如下:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
void printenv() {
int i = 0;
while (environ[i] != NULL) {
printf("%s\n", environ[i]);
i++;
}
}
void main() {
pid_t childPid;
switch(childPid = fork()) {
case 0: /* child process */
printenv(); // 标记1
exit(0);
default: /* parent process */
//printenv(); // 标记2
exit(0);
}
}
编译并运行,结果如下:
step2 中 将 标记1 和 标记 2中的语句换过来,再编译查看结果
可以看到两次都输出了一大长串环境变量,仔细一看还是有一些不一样的,比如输出的最后一个环境变量。使用 diff 命令查看两个输出文件差异如下:
可以看到刚好是最后一个环境变量不同,为各自的文件名,这是因为两次运行的程序文件名不一样,所以这个环境变量不一样。
接下来我们试着编译成同一个程序名,还是按之前的顺序操作,再用diff查看两个输出文件差异,如下:
原因分析:看到两次输出完全一样,一次是父进程的输出