getenv

getenv

getenv是函式名,從環境中取字元串,獲取環境變數的值,getenv()用來取得參數envvar環境變數的內容。參數envvar為環境變數的名稱,如果該變數存在則會返回指向該內容的指針。環境變數的格式為envvar=value。getenv函式的返回值存儲在一個全局二維數組裡,當你再次使用getenv函式時不用擔心會覆蓋上次的調用結果。

基本介紹

函式簡介,程式示例,PHP,CGI,定義,CGI程式示例,代碼,

函式簡介

函式名: 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=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

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。因此,這個變數不總是真實正確的。
當前請求的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程式給客戶端傳送一個信息,表示請求的任務已經結束。此時用戶在瀏覽器里將看到“留言結束”的字樣。整個過程結束。

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程式就大功告成了。

代碼

< FORM ACTION="/cgi-bin/mult.cgi" >
< P >請在下面填入乘數和被乘數,按下確定後可以看到結果。
< INPUT NAME="m" SIZE="5" >
< INPUT NAME="n" SIZE="5" >< BR >
< INPUT TYPE="SUBMIT" VALUE="確定" >
< /FORM >

相關詞條

熱門詞條

聯絡我們