进程环境和属性

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

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

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

参数argc表示参数argv有多少个字符串,注意参数argv的定义表示的是一个不定长的字符串数组。参数envp以name=value的形式存放了一组进程运行中会用到的环境变量。ANSI规定了main()函数只能有两个参数,同时,参数envp也不能给系统开发带来更多的好处,所以POSIX标准规定使用一个全局的环境变量environ取代了参数envp,应用程序可以通过getenv()和putenv()函数读取或设定一个环境变量。

getenv()函数定义如下:

 
 
  1. #include <stdlib.h> 
  2. 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  在程序中获得环境变量

 
 
  1. // filename  getenv.c - 获取环境变量测试  
  2. #include <stdio.h> 
  3. #include <stdlib.h> 
  4.    
  5. int main()  
  6. {  
  7.   char *env_path = "PATH";                  // 打算获取的环境变量名称  
  8.   char *env_value = NULL;                   // 环境变量值  
  9.    
  10.   env_value = getenv(env_path);             // 使用系统函数获取指定环境变量  
  11.   if (NULL==env_value)                      // 检查是否获取到变量的值  
  12.     printf("Not found!/n");  
  13.   printf("Get Env PATH:/n%s", env_value);   // 输出PATH环境变量的值  
  14.   return 0;  

程序编译后运行,输出结果如下:

 
 
  1. Get Env PATH:  
  2. /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):以其他用户组身份访问文件使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值