zoukankan      html  css  js  c++  java
  • CGI原理解析之二------WEB服务和CGI交互数据


    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <stdlib.h>

    #define    CGI_NAME "get_post.ums"
    #define    REQUEST_METHOD "REQUEST_METHOD=POST"
    #define REQUEST_PARAMETER "myname=huangzhihui"

    int main(int argc, char *argv[])
    {
        int fd[2];
        if (pipe(fd) < 0)
        {
            printf("create pipe fail. ");
        }

        pid_t pid;
        if ((pid = fork()) < 0)
        {
            printf("fork fail. ");
        }
        else if (pid > 0)
        {
            /* parent */                
            //模拟向 CGI 传送数据
            ssize_t length = strlen(REQUEST_PARAMETER);
            if (write(fd[1], REQUEST_PARAMETER, length) != length)
            {
                printf("write error to pipe ");
            }
            close(fd[1]);
            
            //等待CGI子进程全然把数据读取后写入,
            //实际情况应该是使用select 或者 epoll 监听
            usleep(1000);

            //模拟接收 CGI 应答的数据        
            char buff[256] = { 0 };
            length = read(fd[0], buff, sizeof(buff));
            if (length <= 0)
            {
                printf("read error from pipe ");
            }
            else
            {
                printf("pid %d read data=%u,%s ",getpid(),length, buff);
            }
            close(fd[0]);

            if (waitpid(pid, NULL, 0) < 0)
            {
                printf("waitpid error ");
            }
            exit(0);
        }
        else
        {
            /* child */
           //重定向管道的输入端到标准输入
            if (fd[0] != STDIN_FILENO)
            {
                if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
                {
                    printf("dup2 error to stdin");
                }
                close(fd[0]);
            }

            //重定向管道的输出端到标准输出
            if (fd[1] != STDOUT_FILENO)
            {
                if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO)
                {
                    printf("dup2 error to stdout");
                }
                close(fd[1]);
            }

            //覆盖进程空间,设置CGI环境变量
            char content_length[128] = { 0 };
            sprintf(content_length, "CONTENT_LENGTH=%u", strlen(REQUEST_PARAMETER));
            char *exec_argv[3] = { REQUEST_METHOD, content_length };
            if (execve(CGI_NAME,argv,exec_argv) < 0)
            {
                printf("execl error for %s", CGI_NAME);
            }
            exit(0);
        }
        exit(0);

    }





  • 相关阅读:
    面试题:你了解对象分配规则吗
    面试题:Java 对象的创建过程
    面试题:Minor GC、Major GC、Full GC的触发时机
    常见的垃圾回收算法
    Java GUI快速入门
    Java Swing 介绍
    Java 开发环境配置
    Java (windows)安装教程
    Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗?
    Qt OpenGL 蒙板
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7196842.html
Copyright © 2011-2022 走看看