8.1.2 进程环境和属性

来源:互联网 发布:uclinux与linux 编辑:程序博客网 时间:2024/06/06 15:53

8.1.2  进程环境和属性

Linux系统,C程序总是从main()函数开始的,当用户编写好的程序在运行的时候,操作系统会使用exec()函数运行程序,在调用main()函数之前,exec()系统调用会先调用一个特殊的启动例程,负责从操作系统内核读取程序的命令行参数,为main()函数准备好工作环境。

由于历史的原因,大多数UNIX系统的main()函数定义如下:

 

int main(int argc, char *argv[], char *envp[]);

 

参数argc表示参数argv有多少个字符串,注意参数argv的定义表示的是一个不定长的字符串数组。参数envpname=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

%提示:环境变量是一个有用的方法,用户可以在程序中通过环境变量获取操作系统提供的信息,同时可以设置自己的环境变量,达到和其他程序以及脚本直接信息交互的目的。

一个进程除了能获得操作系统提供的环境变量外,还具备自身的基本属性,主要包括:

q      进程号(PIDProcess ID):操作系统通过进程号标识一个用户进程。

q      父进程号(PPIDParent Process ID):在Linux系统,除了init进程外,所有的进程都是通过init进程创建的。同时,进程又可以创建其他的进程,最终形成了一个倒过来的树形结构,每个进程都会有自己的父进程,通过父进程号标识。

q      进程组号(PGIDProcess Group ID):操作系统允许对进程分组,不同的进程通过进程组号标识。

q      真实用户号(UIDUser ID):用户的唯一标识号,用于标识一个用户。

q      真实组号(GIDGroup ID):用户组的唯一标识号,用于标识一个用户组。

q      有效用户号(EUIDEffective User ID):以其他用户身份访问文件使用。

q      有效组号(EGIDEffective Group ID):以其他用户组身份访问文件使用。