CGI及CGIC库的使用
CGI作为标记语言html是无法读取硬件信息的但C语言可以实现一个html页面传感器数据的数据是动态变化的html页面是静止的可以让浏览器每一秒刷新一次页面但是浪费资源且体验效果一般关于CGICGI全称为 Common Gateway Interface是一种标准协议定义了Web服务器与外部应用程序通常是执行脚本或程序之间的交互方式主要作用是在Web服务器和生成动态内容的应用程序之间传递信息当用户在Web浏览器中请求一个CGI程序时Web服务器会将请求传递给相应的CGI脚本。脚本执行完成后将结果返回给服务器服务器再将结果传给用户的浏览器CGI脚本可以用多种编程语言编写如Perl、Python、C、或者Shell脚本CGI的特点对http浏览器来说cgi脚本文件只是一个页面文件CGI可以使用任意编程语言编写只要这个语言能把数据输出到标准输出即可CGI是一个标准它规定了系统所必须具备的环境变量CGI相关文档CGI标准官方文档RFC 3875 - The Common Gateway Interface (CGI) Version 1.1 (ietf.org)CGI教程C Web 编程 | 菜鸟教程 (runoob.com)Python CGI 编程 | 菜鸟教程 (runoob.com)Perl CGI编程 | 菜鸟教程 (runoob.com)CGI环境变量变量名描述CONTENT_TYPE内容的数据类型。当客户端向服务器发送附加内容时使用。例如文件上传等功能。CONTENT_LENGTH查询的信息长度。只对 POST 请求可用。HTTP_COOKIE以键 值对的形式返回设置的 cookies。HTTP_USER_AGENT用户代理请求标头字段递交用户发起请求的有关信息包含了浏览器的名称、版本和其他平台性的附加信息。PATH_INFOCGI 脚本的路径。QUERY_STRING通过 GET 方法发送请求时的 URL 编码信息包含 URL 中问号后面的参数。REMOTE_ADDR发出请求的远程主机的 IP 地址。这在日志记录和认证时是非常有用的。REMOTE_HOST发出请求的主机的完全限定名称。如果此信息不可用则可以用 REMOTE_ADDR 来获取 IP 地址。REQUEST_METHOD用于发出请求的方法。最常见的方法是 GET 和 POST。SCRIPT_FILENAMECGI 脚本的完整路径。SCRIPT_NAMECGI 脚本的名称。SERVER_NAME服务器的主机名或 IP 地址。SERVER_SOFTWARE服务器上运行的软件的名称和版本。HTTP请求与CGI脚本的交互过程CGI的交互过程依赖于环境变量和标准输入输出允许服务器动态生成内容处理复杂的用户请求客户端发起请求用户在浏览器中请求一个URL这个URL指向一个CGI脚本该请求可以是GET请求或POST请求服务器接收到请求Web服务器如Apache或Nginx接收到HTTP请求后会检查请求的URL如果URL对应于CGI脚本的路径服务器将识别需要启动CGI处理调度CGI脚本服务器根据请求启动相应的CGI脚本作为新进程运行在启动脚本前服务器设定环境变量这些变量包含了请求的各种信息传递请求数据环境变量服务器通过环境变量传递请求的元数据如请求方法、查询字符串、内容类型等。例如REQUEST_METHOD: 请求方式如GET、POSTQUERY_STRING: URL中的查询字符串CONTENT_TYPE: 请求体的数据类型针对POST请求标准输入stdin对于POST请求请求体的数据通过标准输入传递给CGI脚本。CGI脚本处理请求CGI脚本读取请求数据和环境变量并进行相应的数据处理和逻辑操作。脚本生成输出包括HTTP头部和内容。常见的首个输出头是Content-Type告知响应数据的类型例如Content-Type: text/html。返回响应给服务器脚本执行完成后将输出发送回Web服务器Web服务器将这一输出作为HTTP响应发送回客户端浏览器浏览器显示内容客户端浏览器接收到响应后解析并渲染网页内容供用户查看CGI接口的引入CGI脚本可以用多种编程语言编写如Perl、Python、C、或者Shell脚本#includestdio.hintmain(intargc,char*argv[]){printf(Content-Type: text/html\n\n);printf(!DOCTYPE html\n);printf(html head meta charset\utf-8\\n);printf(title我的html页面/title /head body\n);printf(h1第一个标题/h1\n);printf(p我的第一个段落。/p\n);printf(/body /html \n);return0;}将以上代码编译后的输出文件改为test.cgi放于/usr/lib/cgi-bin/目录下#!/bin/bashechoContent-Type: text/htmlechoecho!DOCTYPE htmlechohtml head meta charset\utf-8\echotitlehtml页面/title /head bodyechoh1标题/h1echop我的第一个段落/pecho/body /html或将以上shell脚本改为test.cgi放于/usr/lib/cgi-bin/目录下运行前需要让http服务器支持CGI功能sudoa2enmod cgisudosystemctl restart apache2浏览器访问ip/cgi-bin/test.cgi.cgi是为了表示这是个CGI程序和其它可执行程序是一样的没有特殊的属性去掉.cgi的后缀不影响其功能CGI程序处理form表单html只是静态页面无法动态的处理这种问题。需要依靠其它具备逻辑控制能力的语言来完这项工作form表单formaction/cgi-bin/login.cgimethodgetinputtypetextnameusernameplaceholder请输入用户名brinputtypepasswordnamepasswordplaceholder请输入密码brinputtypesubmitvalueLogin/formaction/cgi-bin/login.cgi: 这个属性指定了当用户提交表单时表单数据将被发送到服务器上的/cgi-bin/login.cgi文件进行处理methodget: 这个属性指定了表单数据的提交方式typesubmit: 定义了一个提交按钮当用户点击这个按钮时表单数据将被发送到服务器CGI处理程序#includestdio.h#includestdlib.hintmain(void){char*datagetenv(QUERY_STRING);charusername[50],password[50];//%49[^]:表示从当前位置读取最多 49 个字符直到遇到 sscanf(data,username%49[^]password%49s,username,password);//由于告诉浏览器将发送html的文本页面printf(Content-Type: text/html\n\n);//登录成功以后的显示内容printf(h1Login successful! Welcome, %s!/h1,username);return0;}同样将编译好的应用程序改为xxx.cgi复制到/usr/lib/cgi-bin/目录下CGIC库关于CGIC库CGIC 是一个用于开发 CGICommon Gateway Interface程序的 C 库CGIC 库简化了 CGI 程序的开发处理诸如表单数据解析和环境变量管理等常见任务以下是一些 CGIC 库的功能和特点GET 和 POST 解析CGIC 可以自动解析从客户端发送的 GET 和 POST 请求数据并将数据存储为键值对方便开发者获取和使用。文件上传支持处理多部分表单数据multipart/form-data使处理文件上传更为轻松错误处理提供了一些机制来处理输入数据可能引起的错误比如数据缺失或格式错误简化环境变量管理CGIC 提供了一些函数来获取常用的 CGI 环境变量如CONTENT_TYPE、REQUEST_METHOD、QUERY_STRING等跨平台支持CGIC 是用标准 C 语言编写的能够在多种操作系统上使用如 Unix/Linux 和 WindowsCGIC库的下载https://github.com/boutell/cgic构建CGIC应用程序准备源码#includestdio.h#includestring.h#includestdlib.h#includecgic.hintcgiMain(){// 输出 HTTP 响应头cgiHeaderContentType(text/html);// 输出 HTML 头部fprintf(cgiOut,!DOCTYPE html\n);fprintf(cgiOut,html\nhead\nmeta charset\utf-8\\n);fprintf(cgiOut,title我的html页面/title\n/head\nbody\n);Tcharusername[50];charpassword[50];// 获取表单数据if(cgiFormString(username,username,sizeof(username))!cgiFormSuccess){strcpy(username,未知用户);}if(cgiFormString(password,password,sizeof(password))!cgiFormSuccess){strcpy(password,未知密码);}fprintf(cgiOut,h1登录成功欢迎 %s!/h1\n,username);// 输出 HTML 结束标签fprintf(cgiOut,/body\n/html\n);return0;}修改cgic库的Makefile或替换cgitest.c文件以下是添加了注释的Makefile文件内容# 编译选项使用 -g 进行调试信息生成-Wall 打开所有警告信息 CFLAGS-g -Wall # 指定 C 编译器 CCgcc # 指定创建静态库的工具 ARar # 指定静态库索引工具 RANLIBranlib # 指定链接器选项这里找到当前目录下的库链接 cgic 库 LIBS-L./ -lcgic # 默认目标。生成 libcgic.a 静态库、cgictest.cgi 可执行文件和 capture 可执行文件 all: libcgic.a cgictest.cgi capture # 安装目标。将 libcgic.a 复制到 /usr/local/lib将 cgic.h 复制到 /usr/local/include install: libcgic.a cp libcgic.a /usr/local/lib cp cgic.h /usr/local/include echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include. # 静态库目标。生成 cgic.o 对象文件并创建 libcgic.a 静态库 libcgic.a: cgic.o cgic.h rm -f libcgic.a $(AR) rc libcgic.a cgic.o $(RANLIB) libcgic.a # 适用于 mingw32 和 cygwin 用户将生成的可执行文件更改为 .exe 扩展名 # 可执行文件目标 cgictest.cgi确保链接 libcgic.a 静态库 cgictest.cgi: cgictest.o libcgic.a gcc cgictest.o -o cgictest.cgi ${LIBS} # 可执行文件目标 capture确保链接 libcgic.a 静态库 capture: capture.o libcgic.a gcc capture.o -o capture ${LIBS} # 清理目标。删除所有生成的对象文件、静态库和可执行文件 clean: rm -f *.o *.a cgictest.cgi capture cgicunittest # 测试目标。编译并运行单元测试程序 test: gcc -D UNIT_TEST1 cgic.c -o cgicunittest ./cgicunittestCGI存在的问题与解决方案CGICommon Gateway Interface在Web开发中曾经是一种常用的技术但随着现代Web开发技术的进步它的一些问题也逐渐显露出来。以下是CGI存在的一些主要问题及其解决方案性能问题问题CGI每次处理请求时都会启动一个新的进程这对于服务器来说开销非常大尤其是在高并发环境下容易导致性能下降。解决方案使用持久连接技术如FastCGI或SCGI这些技术通过重用进程来处理多个请求从而提高性能。安全问题问题不安全的CGI脚本可能导致安全漏洞比如缓冲区溢出和代码注入。解决方案编写安全的脚本进行输入验证和参数化查询使用现代Web框架这些框架通常提供了更多内置的安全功能。可扩展性问题问题由于CGI的性能限制在大规模应用中难以扩展。解决方案使用更现代的Web应用架构如采用反向代理、负载均衡并结合使用Web应用服务器如Node.js、Django、Flask等。维护性和开发效率问题问题CGI脚本通常直接用C或者Perl编写代码复杂且不易维护。解决方案采用现代编程语言和框架如Python的Flask、Java的Spring等它们提供了更高的开发效率和可维护性。

相关新闻

JOULWATT杰华特 JW4054SOTA#TRPBF SOT23-5 DC-DC电源芯片

JOULWATT杰华特 JW4054SOTA#TRPBF SOT23-5 DC-DC电源芯片

功能特性 最高可达18伏输入可持续电压 7.5伏输入过压保护 最高可达500mA可配置充电电流 输入反接保护 电池反接保护 自动充电管理 涓流充电 恒流充电 恒压充电 充电终止 自动充电 4.2V(JW4054)/4.35V(JW4054A)充电电压,精度1% 电压精度土1% 2.9伏涓流充电阈值 1/10I…

2026/7/6 15:49:10 阅读更多 →
HRO韩荣 DC-005-25A 14.2*9.0mm DC电源连接器

HRO韩荣 DC-005-25A 14.2*9.0mm DC电源连接器

额定值:0.5安培,30伏直流电接触电阻:最大100m2。工作温度:-25C~80C操作力:3-20牛顿工作寿命:5,000次循环

2026/7/3 14:58:32 阅读更多 →
计算机毕设java阅读爱好者社区开发与设计 基于Java技术的阅读爱好者社交平台开发与实现 Java驱动的在线阅读社区系统设计与开发

计算机毕设java阅读爱好者社区开发与设计 基于Java技术的阅读爱好者社交平台开发与实现 Java驱动的在线阅读社区系统设计与开发

计算机毕设java阅读爱好者社区开发与设计bh6729 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在当今数字化时代,阅读不再局限于传统的纸质书籍。随着互联网的普及&…

2026/7/5 15:01:03 阅读更多 →

最新新闻

从绿的谐波×SKF合资到美光93亿扩产:大规模量产时代的设备选型逻辑

从绿的谐波×SKF合资到美光93亿扩产:大规模量产时代的设备选型逻辑

2026年7月7日,制造业释放了三个信号:绿的谐波与SKF成立合资公司聚焦高精密轴承规模化供应、通用技术沈阳机床第1000条组合产线交付、美光93亿美元扩建广岛HBM工厂、日月光宣布调涨先进封装报价。三个信号指向同一个趋势:大规模量产时代的设备…

2026/7/8 12:58:23 阅读更多 →
TPA3128D2与TM4C129LNCZAD音频系统开发指南

TPA3128D2与TM4C129LNCZAD音频系统开发指南

1. 项目背景与核心组件介绍在嵌入式音频系统开发领域,如何实现高保真音质与高效能放大的完美结合一直是工程师们追求的目标。TPA3128D2与TM4C129LNCZAD这对黄金组合,恰好为解决这一需求提供了理想的硬件平台。TPA3128D2是德州仪器(TI)推出的一款双通道D类…

2026/7/8 12:54:22 阅读更多 →
冷库是什么,为什么高效运行离不开核心部件协同 你的冷库电费为何居高不下?问题可能出在“看不见”的部件上

冷库是什么,为什么高效运行离不开核心部件协同 你的冷库电费为何居高不下?问题可能出在“看不见”的部件上

许多生鲜商户或食品加工厂主发现,新装的冷库明明温度达标,但每月电费却远超预期。有人归咎于压缩机功率大,有人怪天气太热,却很少意识到:冷库的高效运行,从来不是单一设备的功劳,而是冷凝机组、…

2026/7/8 12:54:22 阅读更多 →
Unity 智能多媒体展示引擎 1.0

Unity 智能多媒体展示引擎 1.0

智能多媒体展示引擎是一款专为现代应用程序打造的、企业级的 UI 展示解决方案。它的核心使命是通过高度集成化的功能与智能化的逻辑,在各类应用界面中构建出功能强大、体验卓越、易于维护的动态内容展示中心。 基础功能支持 多媒体格式兼容:原生支持在同…

2026/7/8 12:50:15 阅读更多 →
靠谱的餐饮油水分离器哪家好选

靠谱的餐饮油水分离器哪家好选

在餐饮行业中,油水分离器是必不可少的设备。它不仅能有效分离废水中的油脂,减少对环境的污染,还能避免下水道堵塞,保障餐饮场所的正常运营。然而,市场上的油水分离器品牌众多,质量参差不齐,该如…

2026/7/8 12:50:15 阅读更多 →
门店评价不展示的诊断模型

门店评价不展示的诊断模型

从运营诊断角度看,评价不展示可以拆成两个状态:折叠与删除。一、折叠区判断 常见触发项包括:评价文本少于15字、内容参考意义弱、账号与商家关联性强、账号诚信度较低、文案复制粘贴痕迹明显。折叠并不等于商家违规,它更像内容权重…

2026/7/8 12:44:12 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻