【网络】详解HTTP协议的CGI机制和CGI进程

目录

引言

CGI机制模型

伪代码示例


个人主页:东洛的克莱斯韦克-CSDN博客

引言

CGI机制是HTTP协议提供的偏底层的一套机制,也是非常重要的机制——它让大量的业务进程和HTPP协议解耦。而CGI进程是业务层的,用来处理各种数据,比如把用户提交上来的数据插入数据库,再比如做某种运算。

CGI机制和CGI进程在概念上是完全不一样的,他们的关系就行老婆和老婆饼一样。

客户端通过HTTP协议向服务器提交数据的方式主要有两种:

1.GET方法请求,GET方法没有请求正文,一般用来拉取服务器的数据,但也可以通过URL的参数提交数据(URL中 ?分隔符后面的就是要提交的数据)

2.POST方法请求,通过请求正文向服务器提交数据

不同的方法的请求,提交的数据量不一样,HTTP底层的CGI机制在处理上也会不一样。

CGI机制模型

简单来说处理HTTP协议请求和响应的服务是父进程,当客户端提交数据给服务器时,HTTP服务会让子进程进行CGI程序替换(让子进程执行exec系列的系统调用),此时子进程就是CGI进程。

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述_linux ipc-CSDN博客父子进程可以用系统提供的进程间通信的方案完成数据的传输。

可以参考小编如下方案

【Linux系统编程】子进程被程序替换后,如何保持父子进程的通信-CSDN博客

伪代码示例

#define ENV "url_parameter"      // 环境变量的k值 ,GET方法的请求的参数通过环境变量传给子进程
#define ENV_M "request_method"   // 环境变量,请求的方法
#define ENV_L "request_len"      // 环境变量,正文的长度
#define ERR_H "wwwroot/err.html" // 返回错误页面的路径void cgi_dispose_request_y() // 用CGI机制处理数据{//  LOG(INFO, "进入CGI机制的函数了...");// 建立信道,相对于父进程来说int r_channel[2] = {-1, -1}; // 读信道int w_channel[2] = {-1, -1}; // 写信道if (0 != pipe(r_channel) || 0 != pipe(w_channel)) // 创建匿名管道{}// 创建子进程pid_t id = fork();if (id == 0) // 子进程{close(r_channel[0]);close(w_channel[1]);if (setenv(ENV_M, _http_q._method.c_str(), 1) == -1) {);}if (setenv(ENV_L, (std::to_string(_http_q.body_line)).c_str(), 1) == -1){);}// 在程序替换之前,需要把子进程的读信道和写信道分别重定向到标准输入0,标准输出1中if (_http_q.if_url_parameter) // url带参说明它是一个GET请求,用环境变量传递数据{if (setenv(ENV, _http_q._url_parameter.c_str(), 1) == -1){}}// LOG(INFO, "环境变量添加完毕");dup2(w_channel[0], 0); // 0号文件描述符,从信道里读dup2(r_channel[1], 1); // 1号文件描述符,向信道里写// 代码和数据均会被替换,但内核数据不会被替换,包括文件描述符if (execl(_http_q._url_path.c_str(), _http_q._url_path.c_str(), nullptr) == -1){}}else if (-1 == id){}else // 父进程{close(r_channel[1]);close(w_channel[0]);if (_http_q.if_url_parameter == false) // url不带参,在这里说明该请求是一个POST请求{int max = _http_q.body_line;for (int i = 0; i < max; i++){write(w_channel[1], &_http_q.request_body[i], 1); // 把请求正文写入管道}}char ch = 'x';while (read(r_channel[0], &ch, 1) == 1) // 死循环读取数据,管道没有数据阻塞,子进程发送数据完毕退出,文件描述符也会关闭,父进程就会读0,然后退出循环{_http_p.response_body += ch;}close(r_channel[0]); // 关闭文件描述符,在网络通信中,文件描述符也是一种很重要的资源close(w_channel[1]);int code; // 子进程的退出状态waitpid(id, &code, 0);if (WIFEXITED(code)) // 如果子进程是正常退出{}else{}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537948.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

1分钟解锁AI绘本财富密码:从0到10万粉,她只用了三步!

在这个信息爆炸的时代&#xff0c;我们每天都在为生活奔波&#xff0c;赚钱似乎变得越来越难。记得小时候&#xff0c;我们总是梦想着能有一种魔法&#xff0c;让书本里的金币自动飞入脑中&#xff0c;但现实却是残酷的我们只能眼睁睁地看着那些遥不可及的梦想。然而&#xff0…

Selenium with Python学习笔记整理(网课+网站)

本篇是根据学习网站和网课结合自己做的学习笔记&#xff0c;后续会一边学习一边补齐和整理笔记 官方学习网站在这获取&#xff1a; https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

再次被对地观测拒稿

又拒稿了&#xff0c;这次应该不是没法修改了&#xff0c;范围不一样&#xff0c;准备改投其他期刊了。 创新性不够说明还难以达到1区的要求&#xff0c;继续先投着一区试试吧&#xff0c;不行再降了 所以说还需要一开始就对照期刊范围来写&#xff0c;比较有针对性。

apk反编译修改教程系列-----修改apk 去除软件加固状态 应用加固的一些常识与检测【二十六】

目前很多apk应用有加固。其中包括如360加固、腾讯乐固等,厂商无非是把一系列的混淆、加密、隐藏、检测等技术组合起来,封装好给你使用。真实的目的就是防止APK被调试 。呗任意修改。此博文普及一些加固的基本常识。后续实例演示一些apk去加固的步骤。 通过博文了解 1-----a…

OpenAI的o1模型与Transformer的无限潜力:数学证明推理算力无上限

近期&#xff0c;斯隆奖得主马腾宇和Google Brain推理团队创始人Denny Zhou合作&#xff0c;提出了一项引人注目的数学证明&#xff1a;只要思维链&#xff08;CoT&#xff09;足够长&#xff0c;Transformer就有能力解决各种复杂问题。这一发现引发了广泛关注&#xff0c;因为…

智能BI项目第三期

AIGC AI 提问技巧 为了让 Al 更好地理解我们的输入&#xff0c;并给出预期精确的输出&#xff0c;需要严格控制我们的提问词。 1.使用系统预设 控制输入格式(便于Al精确地理解我们的需求) 你是一个数据分析师和前端开发专家&#xff0c;接下来我会按照以下固定格式给你提供…

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

<<编码>> 第 14 章 反馈与触发器(1)--振荡器 示例电路

继电器振荡器 info::操作说明 无需操作, 保持控制开关常闭以形成振荡 如需停止振荡, 则断开控制开关 注: 要看到灯闪烁的效果, 右上角 “仿真速度” 控制杆应设置为一个较低的位置(靠左侧) 另: 因继电器内部开关跳动动画效果耗时太长, 即便设置为较低的仿真速度也无法观察到开关…

不要沉迷大模型的技术与理论,学习大模型的方法——从做一个小应用开始

“ 在应用中学习技术&#xff0c;而不是沉迷于技术本身 ” 不知道大家都是怎么学习大模型技术的&#xff0c;但从个人的经验和公众号的反馈来看&#xff0c;有些人在学习大模型技术时转进了牛角尖&#xff0c;导致很多东西学不明白&#xff0c;事倍功半。 今天就从个人的学习…

PDF标准详解(五)——图形状态

在第三节中&#xff0c;我们说到Q/q 这一对操作符是用来保存和还原图形状态的&#xff0c;那个时候只有一个简单的概念&#xff0c;变换矩阵是图形状态的一员&#xff0c;那么什么是图形状态&#xff0c;以及有哪些图形状态呢&#xff1f;本节将要描述这部分的内容 图形状态 …

PHP邮箱系统:从入门到实战搭建教程指南!

PHP邮箱系统配置教程&#xff1f;如何选用合适的PHP邮箱系统库&#xff1f; 为了满足个性化和定制化的需求&#xff0c;许多开发者选择使用PHP来搭建自己的邮箱系统。AokSend将带你从入门到实战&#xff0c;详细介绍如何搭建一个功能完善的PHP邮箱系统。 PHP邮箱系统&#xf…

dcmtk在MWLSCP会忽略对于字符集的匹配

版本信息 dcmtk v3.6.4 2018-11-29 发现的原因 在我将dcmtk的wlmscpfs当作MWLSCP使用的时候&#xff0c;我在SCU端为了防止过来的数据中存在不识别的字符集&#xff0c;对于收到的数据数据进行了字符集的过滤&#xff0c;但是发现过滤没有生效。 确保数据源 首先需要确认数…

从openAI最新模型GPT-o1再谈思维链(Cot)技术,大模型该怎么提升其逻辑推理能力?

“ 推理能力是大模型迈向AGI的必经之路 ” 最近openAI发布了号称史上最强模型——o1&#xff0c;其具有强大的逻辑推理能力&#xff0c;号称能达到人类的博士生水平。 而从o1模型的评测来看&#xff0c;o1模型在数学竞赛&#xff0c;编码&#xff0c;科学问答等方面表现良好&…

这几个电脑文件加密的方法你都知道吗?

1. 使用操作系统自带的加密功能 Windows BitLocker&#xff1a;Windows的BitLocker是一个内置的磁盘加密工具。你可以通过右键点击磁盘驱动器&#xff0c;选择“启用BitLocker”&#xff0c;然后按照提示设置密码或使用USB密钥加密整个硬盘或分区。macOS FileVault&#xff1a…

AQS详解

线程创建方式 继承Thread类实现Runnable接口实现Callable接口 LockSupport的使用 LockSupport.park()/LockSupport.unpark() LockSupport是一个工具类&#xff0c;提供了基本的线程阻塞和唤醒功能&#xff0c;它是创建锁和其他同步组件的基础工具&#xff0c;内部是使用sun…

医学数据分析实训 项目七 继承学习--空气质量指标--天气质量分析和预测

项目七&#xff1a;集成学习 实践目的 理解集成学习算法原理&#xff1b;熟悉并掌握常用集成学习算法的使用方法&#xff1b;熟悉模型性能评估的方法&#xff1b;掌握模型优化的方法。 实践平台 操作系统&#xff1a;Windows7及以上Python版本&#xff1a;3.8.x及以上集成开…

【大模型技术教程】FastGPT一站式解决方案[1-部署篇]:轻松实现RAG-智能问答系统

FastGPT是一个功能强大的平台&#xff0c;专注于知识库训练和自动化工作流程的编排。它提供了一个简单易用的可视化界面&#xff0c;支持自动数据预处理和基于Flow模块的工作流编排。FastGPT支持创建RAG系统&#xff0c;提供自动化工作流程等功能&#xff0c;使得构建和使用RAG…

C++速通LeetCode中等第3题-字母异位词分组

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

C++入门 之 类和对象(中)

目录 一、类的默认成员函数 ​编辑二、构造函数 三、析构函数 四、拷贝构造函数 五.运算符重载 六、赋值运算重载 七、日期类的实现 1、Date.h 2、Date.cpp 八、取地址运算符重载 1、const成员函数 2、取地址运算符重载 一、类的默认成员函数 默认成员函数就是用户不…

java之顺序表的创建

顺序表的定义&#xff1a; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组上完成数据的增删查改。 我们现在要实现的顺序表功能有&#xff1a;增&#xff08;add&#xff09;、删(remove)、查(get&#xff09; …