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

摘自: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应用程序有关的环境变量,而一个获得的是系统的环境变量。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭