#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.\n");

    }



    pid_t pid;

    if ((pid = fork()) < 0)

    {

        printf("fork fail.\n");

    }

    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\n");

        }

        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\n");

        }

        else

        {

            printf("pid %d read data=%u,%s\n",getpid(),length, buff);

        }

        close(fd[0]);



        if (waitpid(pid, NULL, 0) < 0)

        {

            printf("waitpid error\n");

        }

        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);

}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpoeHh4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

CGI原理解析之二------WEB服务和CGI交互数据的更多相关文章

  1. Web APi之过滤器执行过程原理解析【二】(十一)

    前言 上一节我们详细讲解了过滤器的创建过程以及粗略的介绍了五种过滤器,用此五种过滤器对实现对执行Action方法各个时期的拦截非常重要.这一节我们简单将讲述在Action方法上.控制器上.全局上以及授 ...

  2. CGI原理解析系列之中的一个----CGI怎样获取WEBserver数据

    //gcc get_post.c -o get_post.ums; #include <stdio.h> #include <stdlib.h> #include <un ...

  3. Spring源码:IOC原理解析(二)

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 接着上一章节的内容,我们来分析当new一个FileSystemXmlApplicationContext对象的时候,spring到底做了那 ...

  4. SpringBoot启动流程原理解析(二)

    在上一章我们分析了SpingBoot启动流程中实例化SpingApplication的过程. return new SpringApplication(primarySources).run(args ...

  5. RocketMQ架构原理解析(二):消息存储

    一.概述 由前文可知,RocketMQ有几个非常重要的概念: broker 服务端,负责存储.收发消息 producer 客户端1,负责产生消息 consumer 客服端2,负责消费消息 既然是消息队 ...

  6. kprobe原理解析(二)

    上一篇文章和大家简要说明了下kprobe到底应该怎样用,那么现在我们就揭开kprobe神秘的面纱,刨根问底,一睹kprobe的庐山真面目. kprobe的工作过程大致如下: 1)注册kprobe.注册 ...

  7. 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

    http://blog.csdn.net/jimoshuicao/article/details/9283071 2)蒙皮信息和蒙皮过程 2-1)Skin info的定义 上文曾讨论过,Skinned ...

  8. APPcrawler基础原理解析及使用

    一.背景 一年前,我们一直在用monkey进行Android 的稳定性测试 ,主要目的就是为了测试app 是否会产生Crash,是否会有ANR,页面错误等问题,在monkey测试过程中,实现了脱离Ca ...

  9. 如何测试Web服务.1

    一.什么是web服务  web服务在简单术语中可被定义为通过安装了特定设备或服务器到另一装置或客户端应用程序通过WWW彼此通信后的应用程序(万维网)提供的服务. Web服务通常在计算机网络的应用层上使 ...

随机推荐

  1. android-EditText 更改外边框无效

    修改的代码如下 <com.android.mms.ui.EnhanceEditText android:textColor="#000000" <!--问题处在这里,a ...

  2. Day5上午解题报告

    预计分数:100+40+30=170 实际假分数:0+0+0=0 CE*3 实际真分数:60+50+0=110 老师没把我的程序放的文件夹里面,于是..... T1 https://www.luogu ...

  3. PHP: php_ldap.dll不能加载解决方案

    PHP: php_ldap.dll不能加载解决方案 php.ini中开启 ldap的扩展后,重启服务:phpinfo();中没有ldap apache_error.log 提示:PHP Warning ...

  4. poi完美word转html(表格、图片、样式)

    直入正题,需求为页面预览word文档,用的是poi3.8,以下代码支持表格.图片,不支持分页,只支持doc,不支持docx: /** * */ import java.io.BufferedWrite ...

  5. Android RingtoneManager 铃声管理

    package com.Aina.Android; import java.io.File; import android.app.Activity; import android.content.I ...

  6. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  7. spring 通过编程来获取属性文件

    配置可以读取属性: <beans profile="dev"> <context:property-placeholder ignore-resource-not ...

  8. Vue自定义组件

  9. 【AtCoder Regular Contest 082 F】Sandglass

    [链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...

  10. SoapUI、Jmeter、Postman三种接口测试工具的比较分析——灰蓝

    前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下吧.各位如果要转载,请一定注明来源,最好在评论中告知博主一声,感谢.本报告从多个方面对接口测试的三款常用工具 ...