在Linux系统,C程序总是从main()函数开始的,当用户编写好的程序在运行的时候,操作系统会使用exec()函数运行程序,在调用main()函数之前,exec()系统调用会先调用一个特殊的启动例程,负责从操作系统内核读取程序的命令行参数,为main()函数准备好工作环境。
由于历史的原因,大多数UNIX系统的main()函数定义如下:
- int main(int argc, char *argv[], char *envp[]);
参数argc表示参数argv有多少个字符串,注意参数argv的定义表示的是一个不定长的字符串数组。参数envp以name=value的形式存放了一组进程运行中会用到的环境变量。ANSI规定了main()函数只能有两个参数,同时,参数envp也不能给系统开发带来更多的好处,所以POSIX标准规定使用一个全局的环境变量environ取代了参数envp,应用程序可以通过getenv()和putenv()函数读取或设定一个环境变量。
getenv()函数定义如下:
- #include <stdlib.h>
- char *getenv(const char *name);
参数name是要获取的环境变量名字,函数返回值为NULL,表示没有获取到指定环境变量的值,否则指向获取到的环境变量值的字符串。POSIX.1标准定义了若干环境变量,请参考表8-1。
表8-1 POSIX.1定义的环境变量及含义
变 量 | 含 义 | 变 量 | 含 义 |
HOME | 起始目录 | LC_TIME | 本地日期/时间格式 |
LANG | 本地名(本地语言类型) | LOGNAME | 登录名 |
LC_ALL | 本地名 | NLSPATH | 消息类模板序列 |
LC_COLLATE | 本地排序名 | PATH | 搜索可执行文件的路径 |
LC_CTYPE | 本地字符分类名 | TERM | 终端类型 |
LC_MONETARY | 本地货币类型 | TZ | 时区信息 |
LC_NUMERIC | 本地数字编辑名 |
|
|
表8-1定义的环境变量不是所有的系统都能实现,在Linux系统下如果使用bash作为命令行,可以执行export查看本机支持的环境变量名称和内容。实例8-1演示如何得到环境变量,代码如下:
实例8-1 在程序中获得环境变量
- // filename getenv.c - 获取环境变量测试
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- char *env_path = "PATH"; // 打算获取的环境变量名称
- char *env_value = NULL; // 环境变量值
- env_value = getenv(env_path); // 使用系统函数获取指定环境变量
- if (NULL==env_value) // 检查是否获取到变量的值
- printf("Not found!/n");
- printf("Get Env PATH:/n%s", env_value); // 输出PATH环境变量的值
- return 0;
- }
程序编译后运行,输出结果如下:
- Get Env PATH:
- /opt/rmi/1.1/mipscross/elf/bin:/opt/rmi/1.1/mipscross/
crosstool/gcc-3.4.3-glibc-2.3.6/mipsisa32-xlr-linux/bin:/
usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/gonglei/bin[gonglei
提示:环境变量是一个有用的方法,用户可以在程序中通过环境变量获取操作系统提供的信息,同时可以设置自己的环境变量,达到和其他程序以及脚本直接信息交互的目的。
一个进程除了能获得操作系统提供的环境变量外,还具备自身的基本属性,主要包括:
进程号(PID:Process ID):操作系统通过进程号标识一个用户进程。
父进程号(PPID:Parent Process ID):在Linux系统,除了init进程外,所有的进程都是通过init进程创建的。同时,进程又可以创建其他的进程,最终形成了一个倒过来的树形结构,每个进程都会有自己的父进程,通过父进程号标识。
进程组号(PGID:Process Group ID):操作系统允许对进程分组,不同的进程通过进程组号标识。
真实用户号(UID:User ID):用户的唯一标识号,用于标识一个用户。
真实组号(GID:Group ID):用户组的唯一标识号,用于标识一个用户组。
有效用户号(EUID:Effective User ID):以其他用户身份访问文件使用。
有效组号(EGID:Effective Group ID):以其他用户组身份访问文件使用。