您的位置:首页 > 编程语言 > C语言/C++

cgi获取所有环境变量[C语言]

2011-10-13 16:16 459 查看
摘自:http://blog.chinaunix.net/space.php?uid=620765&do=blog&cuid=297086

还记得C语言main函数的完整声明吗?

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

这个就是c语言中main函数的完整声明, argc表示参数个数,argv表示参数字符串,而这个envp就表示环境变量字符串。参数和环境变量都可以不止一个,所以,用指向字符串指针的指针来表示。

比如我们用C语言写了一个程序,运行在命令行下,带有2个参数

C:> cpfile.exe c:\test.txt d:\test.txt

那么这里的

argc=3;

argv[0] = "cpfile.exe";

argv[1] = "c:\test.txt";

argv[2] = "d:\test.txt";

在c语言中的stdlib.h中有一个

extern char **environ; 或者

extern char **_environ;的声明

这个envp的参数实际上就是environ。

好,我们看看在cgi程序(其实就是一个C语言程序)里面怎么枚举这些环境变量

先写一个html页面:(当然也可以不要)

<form name="form1" method="POST" action="cgi-bin/env.cgi">

Username: <input type = "text" name="usr"> <br>

Password: <input type = "password" name="pwd"><br>

<input type="submit" name="submit" value="Submit">

<input type="reset" name = "reset" value="Reset">

</form>

呈现效果如下:

Username:

Password:

cgi程序源码:

/* env.c */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_CONTENT_LEN 1024

int main()

{

extern char **environ;

int nlen = 0;

int i;

char szContent[MAX_CONTENT_LEN];

char **penv;

char *req = NULL;

memset(szContent, 0, MAX_CONTENT_LEN);

printf("Content-type: text/html\n\n");

for ( penv = environ; *penv; penv++ )

printf("%s<br>", *penv);

if ( strcmp("POST", getenv("REQUEST_METHOD")) == 0 )

{

nlen = atoi(getenv("CONTENT_LENGTH"));

for (i = 0; i < nlen; i++ )

{

if ( i < MAX_CONTENT_LEN )

szContent[i] = fgetc(stdin);

else

break;

}

printf("<p>%s</p>", szContent);

}

else

{

printf("<p>%s</p>", getenv("QUERY_STRING"));

}

return 0;

}

在地址栏 http://localhost/testenv.htm
假设我们输入的用户名和密码分别为abcd和efgh,提交表单之后,在我的机器上显示的结果如下:

COMSPEC=C:\WINDOWS\system32\cmd.exe

CONTENT_LENGTH=31

CONTENT_TYPE=application/x-www-form-urlencoded

DOCUMENT_ROOT=d:/chateaurt4/www

HTTP_ACCEPT=text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5

HTTP_ACCEPT_CHARSET=gb2312,utf-8;q=0.7,*;q=0.7

HTTP_ACCEPT_ENCODING=gzip,deflate

HTTP_ACCEPT_LANGUAGE=zh-cn,zh;q=0.5

HTTP_CONNECTION=keep-alive

HTTP_HOST=localhost

HTTP_KEEP_ALIVE=300

HTTP_REFERER=http://localhost/testenv.htm

HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3

PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Microsoft Visual Studio\Common\Tools\WinNT;D:\Microsoft Visual Studio\Common\MSDev98\Bin;D:\Microsoft Visual Studio\Common\Tools;D:\Microsoft Visual Studio\VC98\bin;D:\AppServ\Apache2.2\bin;D:\AppServ\php5;D:\AppServ\MySQL\bin

REMOTE_ADDR=127.0.0.1

REMOTE_PORT=1644

SCRIPT_FILENAME=d:/chateaurt4/www/cgi-bin/env.cgi

SERVER_ADDR=127.0.0.1

SERVER_ADMIN=who@where.net

SERVER_NAME=localhost

SERVER_PORT=80

SERVER_SIGNATURE=
Apache/1.3.33 Server at localhost Port 80

SERVER_SOFTWARE=Apache/1.3.33 (Win32)

SystemRoot=C:\WINDOWS

WINDIR=C:\WINDOWS

GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.1

REQUEST_METHOD=POST

QUERY_STRING=

REQUEST_URI=/cgi-bin/env.cgi

SCRIPT_NAME=/cgi-bin/env.cgi

usr=abcd&pwd=efgh&submit=Submit
当然不同的机器,它输出的有些结果可能不一样。如果单纯为了输出环境变量,我们可以这样做:

#include <stdio.h>

int main (int argc, char **argv, char **envp)

{

char **var = envp;

while (*var)

printf ("%s \n",*var++);

return 0;

}

这里面得到的环境变量结果和CGI程序里面的结果差别比较大,因为一个是获得与web应用程序有关的环境变量,而一个获得的是系统的环境变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: