问题
main 函数 (默认进程入口)
int main(int argc, char* argv[], char* env[])
- argc - 命令行参数个数
- argv[] - 命令行参数数组
- env[] - 环境变量数组 (最后一个元素为 NULL)
什么是环境变量?
环境变量是进程运行过程中可能用到的 "键值对" (NAME = VALUE)
进程拥有一个环境表 (environment list),环境表包含了环境变量
环境表用于记录系统中相对固定的共享信息 (不特定于具体进程)
进程之间的环境表相对独立 (环境表可在父子进程之间传递)
环境表的构成
全局指针 environ 指向当前进程的环境表,环境表是一个字符串数组,数组中的每一个字符串都是一个环境变量,数组的最后最后一项为 NULL,表示环境表的结束
环境变量初探
parent.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#define EXE "child.out"
int create_process(char* path, char* args[], char* env[])
{
int ret = fork();
if( ret == 0 )
{
execve(path, args, env);
}
return ret;
}
int main()
{
char path[] = EXE;
char arg1[] = "hello";
char arg2[] = "world";
char* args[] = {path, arg1, arg2, NULL};
printf("%d begin\n", getpid());
printf("%d child = %d\n", getpid(), create_process(EXE, args, args));
printf("%d end\n", getpid());
return 0;
}
child.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char* argv[], char* env[])
{
int i = 0;
sleep(1);
printf("process parameter:\n");
for(i=0; i<argc; i++)
printf("exec = %d, %s\n",
getpid(), argv[i]);
printf("environment list:\n");
i = 0;
while( env[i] )
printf("exec = %d, %s\n",
getpid(), env[i++]);
return 0;
}
parent.c 中会创建子进程运行 child.out 程序,并传递给子进程 进程参数 和 环境变量,传递给子进程的环境变量和进程参数的值是一样的
程序运行结果如下图所示:
通过打印可以看出,子进程的进程参数和环境变量的值是一样的
我们直接在命令行中运行 chlid.out 程序
在命令行中执行 child.out 程序, 打印出来的环境变量是父进程命令行传递过来的,所以 child.out 这个进程的环境变量和命令行的环境变量值是相同的
深入理解环境变量
对于进程来说,环境变量是一种特殊的参数
环境变量相对于 启动参数 较稳定 (系统定义 且 各个进程共享)
环境变量遵守固定规范 (如:键值对,变量名大写)
环境变量 和 启动参数 存储于同一内存区域 (私有)
环境变量读写接口
头文件: #include <stdlib.h>
读: char* getenv(const char* name);
返回 name 环境变量的值,如果不存在,返回 NULL
写: int putenv(char* string);
设置 / 改变 环境变量 (NAME=VALUE),string 不能是栈上定义的字符串
环境表入口: