複製鏈接
請複製以下鏈接發送給好友

getenv

鎖定
getenv是函數名,從環境中取字符串,獲取環境變量的值,getenv用來取得參數envvar環境變量的內容。參數envvar為環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格式為envvar=value。getenv函數的返回值存儲在一個全局二維數組裏,當你再次使用getenv函數時不用擔心會覆蓋上次的調用結果。
中文名
getenv
獲    取
環境變量
功 能
環境中取字符串獲取環境變量的值
頭文件
stdlib.h
相關函數
_wgetenv

目錄

getenv函數簡介

函數名: getenv
功 能: 從環境中取字符串,獲取環境變量的值
頭文件: stdlib.h
用 法:char *getenv(char *envvar);
函數説明:getenv用來取得參數envvar環境變量的內容。參數envvar為環境變量的名稱,如果該變量存在則會返回指向該內容的指針。環境變量的格式為envvar=value。getenv函數的返回值存儲在一個全局二維數組裏,當你再次使用getenv函數時不用擔心會覆蓋上次的調用結果。
返回值: 執行成功則返回指向該內容的指針,找不到符合的環境變量名稱則返回NULL。如果變量存在但無關聯值,它將運行成功並返回一個空字符串,即該字符的第一個字節是null。
相關函數:_wgetenv、getenv_s、_wgetenv_s

getenv程序示例

程序例1:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
  char* s=NULL;
  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=NULL;
  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

getenvPHP

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 認證功能,這個變量便是用户輸入的密碼。

getenvCGI

定義
通用網關接口Common Gateway Interface,簡稱CGI。在物理上是一段程序,運行在服務器上,提供同客户端HTML頁面的接口。這樣説大概還不好理解。那麼我們看一個實際例子: 現在的個人主頁上大部分都有一個留言本。留言本的工作是這樣的:先由用户在客户端輸入一些信息,如名字之類的東西。接着用户按一下“留言”(到目前為止工作都在客户端),瀏覽器把這些信息傳送到服務器的CGI目錄下特定的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編程常用的一個技巧。
程序在後面調用了用了庫函數getenv來得到QUERY_STRING的內容的字節數,然後使用sscanf函數把每個參數值取出來,要注意的是sscanf函數的用法。其他的就沒有什麼了,和一般的C程序沒有區別。
Linux系統下用gcc編譯把程序編譯為mult.cgi並/cgi-bin/目錄下面,就可以被表單調用了。這樣,一個處理GET方式表單的CGI程序就大功告成了。
代碼
< FORM ACTION="/cgi-bin/mult.cgi" >
< P >請在下面填入乘數被乘數,按下確定後可以看到結果。
< INPUT NAME="m" SIZE="5" >
< INPUT NAME="n" SIZE="5" >< BR >
< INPUT TYPE="SUBMIT" VALUE="確定" >
< /FORM >