标题：getenv
函数简介
函数名: getenv
功 能: 从环境中取字符串,获取环境变量的值
头文件: stdlib.h
用 法:char *getenv(char *envvar);
函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称，如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里，当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
返回值: 执行成功则返回指向该内容的指针，找不到符合的环境变量名称则返回NULL。如果变量存在但无关联值，它将运行成功并返回一个空字符串，即该字符的第一个字节是null。
相关函数：_wgetenv、getenv_s、_wgetenv_s
程序示例
程序例1:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *s;
s=getenv("COMSPEC"); /* get the comspec environment parameter */
printf("Command processor: %s\n",s); /* display comspec parameter */
return 0;
}
执行:COMSPEC = name
程序例2：
下面这个例子来自MSDN
#include <stdlib.h>
#include <stdio.h>
int main( void )
{
char *libvar;
libvar = getenv( "LIB" ); // C4996
if( libvar != NULL )
printf( "Original LIB variable is: %s\n", libvar );
_putenv( "LIB=c:\\mylib;c:\\yourlib" ); // C4996
libvar = getenv( "LIB" ); // C4996
if( libvar != NULL )
printf( "New LIB variable is: %s\n", libvar );
return 0;
}
Sample Output（输出结果）：
Original LIB variable is: C:\progra~1\devstu~1\vc\lib
New LIB variable is: c:\mylib;c:\yourlib
PHP
在PHP中getenv(参数)函数是一个用于获取环境变量的函数，根据提供不同的参数可以获取不同的环境变量，具体如下:
“PHP_SELF” 
当前正在执行脚本的文件名，与document root 相关。
如果PHP 以命令行方式运行，该变量在PHP 4.3.0 之前无效。
“argv”
传递给该脚本的参数。当脚本运行在命令行方式时，argv 变量传递给程序C 语言样式的命令行参数。当调用GET 方法时，该变量包含请求的数据。
“argc”
包含传递给程序的命令行参数的个数（如果运行在命令行模式）。
“GATEWAY_INTERFACE”
服务器使用的CGI 规范的版本。例如，“CGI/1.1”。
“SERVER_NAME”
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上，该名称是由那个虚拟主机所设置的值决定。
“SERVER_SOFTWARE”
服务器标识的字串，在响应请求时的头信息中给出。
“SERVER_PROTOCOL”
请求页面时通信协议的名称和版本。例如，“HTTP/1.0”。
“REQUEST_METHOD”
访问页面时的请求方法。例如：“GET”、“HEAD”，“POST”，“PUT”。
注: 如果请求的方式是HEAD，PHP 脚本将在送出头信息后中止（这意味着在产生任何输出后，不再有输出缓冲）。
“REQUEST_TIME”
请求开始时的时间戳。从PHP 5.1.0 起有效。
“QUERY_STRING”
查询（query）的字符串（URL 中第一个问号? 之后的内容）。
“DOCUMENT_ROOT”
当前运行脚本所在的文档根目录。在服务器配置文件中定义。
“HTTP_ACCEPT”
当前请求的Accept: 头信息的内容。
“HTTP_ACCEPT_CHARSET”
当前请求的Accept-Charset: 头信息的内容。例如：“iso-8859-1,*,utf-8”。
“HTTP_ACCEPT_ENCODING”
当前请求的Accept-Encoding: 头信息的内容。例如：“gzip”。
“HTTP_ACCEPT_LANGUAGE”
当前请求的Accept-Language: 头信息的内容。例如：“en”。
“HTTP_CONNECTION”
当前请求的Connection: 头信息的内容。例如：“Keep-Alive”。
“HTTP_HOST”
当前请求的Host: 头信息的内容。
“HTTP_REFERER”
链接到当前页面的前一页面的URL 地址。不是所有的用户代理（浏览器）都会设置这个变量，而且有的还可以手工修改HTTP_REFERER。因此，这个变量不总是真实正确的。
“HTTP_USER_AGENT”
当前请求的User-Agent: 头信息的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是：Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用get_browser() 得到此信息。
“HTTPS”
如果脚本是通过HTTPS 协议被访问，则被设为一个非空的值。
“REMOTE_ADDR”
正在浏览当前页面用户的IP 地址。
“REMOTE_HOST”
正在浏览当前页面用户的主机名。反向域名解析基于该用户的REMOTE_ADDR。
注: 必须配置Web 服务器来建立此变量。例如Apache 需要在httpd.conf 中有HostnameLookups On。参见gethostbyaddr()。
“REMOTE_PORT”
用户连接到服务器时所使用的端口。
“SCRIPT_FILENAME”
当前执行脚本的绝对路径名。
注: 如果脚本在CLI 中被执行，作为相对路径，例如file.php 或../file.php，$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。
“SERVER_ADMIN”
该值指明了Apache 服务器配置文件中的SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上，则该值是那个虚拟主机的值。
“SERVER_PORT”
服务器所使用的端口。默认为“80”。如果使用SSL 安全连接，则这个值为用户设置的HTTP 端口。
“SERVER_SIGNATURE”
包含服务器版本和虚拟主机名的字符串。
“PATH_TRANSLATED”
当前脚本所在文件系统（不是文档根目录）的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
注: PHP 4.3.2 之后，PATH_TRANSLATED 在Apache 2 SAPI 模式下不再和Apache 1 一样隐含赋值，而是若Apache 不生成此值，PHP 便自己生成并将其值放入SCRIPT_FILENAME 服务器常量中。这个修改遵守了CGI 规范，PATH_TRANSLATED 仅在PATH_INFO 被定义的条件下才存在。
Apache 2 用户可以使用httpd.conf 中的AcceptPathInfo On 来定义PATH_INFO。
“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名（例如包含文件）。
“REQUEST_URI”
访问此页面所需的URI。例如，“/index.html”。
“PHP_AUTH_DIGEST”
当作为Apache 模块运行时，进行HTTP Digest 认证的过程中，此变量被设置成客户端发送的“Authorization”HTTP 头内容（以便作进一步的认证操作）。
“PHP_AUTH_USER”
当PHP 运行在Apache 或IIS（PHP 5 是ISAPI）模块方式下，并且正在使用HTTP 认证功能，这个变量便是用户输入的用户名。
“PHP_AUTH_PW”
当PHP 运行在Apache 或IIS（PHP 5 是ISAPI）模块方式下，并且正在使用HTTP 认证功能，这个变量便是用户输入的密码。
CGI
定义通用网关接口Common Gateway Interface，简称CGI。在物理上是一段程序，运行在服务器上，提供同客户端HTML页面的接口。这样说大概还不好理解。那么我们看一个实际例子： 现在的个人主页上大部分都有一个留言本。留言本的工作是这样的：先由用户在客户端输入一些信息，如名字之类的东西。接着用户按一下“留言”（到目前为止工作都在客户端），浏览器把这些信息传送到服务器的CGI目录下特定的cgi程序中，于是cgi程序在服务器上按照预定的方法进行处理。在本例中就是把用户提交的信息存入指定的文件中。然后cgi程序给客户端发送一个信息，表示请求的任务已经结束。此时用户在浏览器里将看到“留言结束”的字样。整个过程结束。程序示例本例就处理get方式表单的CGI进行讲解：(程序名mult.c)
#include < stdio.h > 
#include < stdlib.h > 
int main(void) 
{ 
char *data; 
long m,n; 
printf（"Content-Type:text/html\n\n); 
printf("< TITLE >乘法结果< /TITLE > "); 
printf("< H3 >乘法结果< /H3 > "); 
data = getenv("QUERY_STRING"); 
if(data == NULL) 
printf("< P >错误！数据没有被输入或者数据传输有问题"); 
else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2) 
printf("< P >错误！输入数据非法。表单中输入的必须是数字。"); 
else 
printf("< P >%ld和%ld的成绩是：%ld。",m,n,m*n); 
return 0; 
} 
具体的C语法就不多讲了，我们来看看它作为CGI程序所特殊的地方。
前面已经提到标准输出的内容就是要被显示在浏览器中的内容。第一行的输出内容是必须的，也是一个CGI程序所特有的：printf("Content-Type:text/html\n\n")，这个输出是作为HTML的文件头。因为CGI不仅可以像浏览器输出HTML文本，而且可以输出图像，声音之类的东西。这一行告诉浏览器如何处理接受到的内容。在Content-Type的定义后面跟有两行的空行，这也是不可缺少的。因为所有CGI程序的头部输出都是相近的，因而可以为其定义一个函数，来节省编程的时间。这是CGI编程常用的一个技巧。
程序在后面调用了用了库函数getevn来得到QUERY_STRING的内容，然后使用sscanf函数把每个参数值取出来，要注意的是sscanf函数的用法。其他的就没有什么了，和一般的C程序没有区别。
Linux系统下用gcc编译把程序编译为mult.cgi并/cgi-bin/目录下面，就可以被表单调用了。这样，一个处理GET方式表单的CGI程序就大功告成了。html代码< FORM ACTION="/cgi-bin/mult.cgi" > 
< P >请在下面填入乘数和被乘数，按下确定后可以看到结果。
< INPUT NAME="m" SIZE="5" > 
< INPUT NAME="n" SIZE="5" >< BR > 
< INPUT TYPE="SUBMIT" VALUE="确定" > 
< /FORM >