日期:2014-05-16  浏览次数:20849 次

web服务器给设置环境变量,cgi无法得到
本机测试  127.0.0.1/cgi-bin/adder.cgi?10&20

    服务器进行  HTTP响应的部分代码
    sprintf(buf, "HTTP/1.0 200 ok\r\n");
    rio_writen(fd, buf, strlen(buf));
    sprintf(buf, "Server:Tiny web server\r\n");
    rio_writen(fd, buf, strlen(buf));
    sprintf(buf, "cgiargs:%s\r\n",cgiargs);
    rio_writen(fd, buf, strlen(buf));
    if(fork() == 0)
    {
        //set cgi vars here
        setenv("QUERY_STRING", cgiargs, 1);
        dup2(fd, STDOUT_FILENO);
        execve(filename, NULL, NULL);
    }
    wait(NULL)


cgi 获取 环境变量的代码

    char *buf, *p;
    char arg1[10], arg2[10];
    char content[MAXLINE];
    int n1 = 0, n2 = 0;
    int flag = 0;

    if((buf = getenv("QUERY_STRING")) != NULL)
    {
        p = strchr(buf, '&');
        *p = '\0';
        strcpy(arg1, buf);
        strcpy(arg2, p+1);
        n1 = atoi(arg1);
        n2 = atoi(arg2);
        flag = 1;
    }


下面为返回报文
HTTP/1.0 200 ok
Server:Tiny web server
cgiargs:10&20
Content-length:114
Content-type:text/html

Welcome to add.com:The Internet addition portal.
<p>The answer is :0 + 0 = 0
<p>Thanks for visiting!
flag = 0
Connection closed by foreign host.

能看出cgiargs 解析没有错误。
通过随后对flag 的判断,发现buf 始终为Null,即未取到环境变量,不知道到 哪块出问题了? 
还请大神指导下,谢谢


------解决方案--------------------
本帖最后由 qq120848369 于 2013-05-25 18:05:04 编辑
你的execve用的不对,虽然你设置了子进程的环境变量,但你接着用NULL,NULL调用了execve把环境变量和命令行参数全清空了。

你应该使用execv/execvp, 让子进程直接继承父进程的环境变量,这样setenv的才能继承下去。