首页 > 代码库 > CGI原理解析之二------WEB服务和CGI交互数据
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.\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=http://www.mamicode.com/%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);
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。