我正在用 C 编写一个基本的 http 服务器。处理一个简单的静态 .html 文件很容易,但我不知道如何处理动态 .pl .cgi 文件扩展名。
我知道我将不得不使用 exec() 但我的问题如何?
我正在用 C 编写一个基本的 http 服务器。处理一个简单的静态 .html 文件很容易,但我不知道如何处理动态 .pl .cgi 文件扩展名。
我知道我将不得不使用 exec() 但我的问题如何?
看看CGI 规范。特别是第 4 节“调用脚本”和第 6 节“CGI 脚本的数据输入”。您需要设置环境变量以供 cgi 脚本读取(QUERY_STRING、SCRIPT_NAME 等)。这不能让你走。
HTTP 服务器的作用是实现 HTTP 协议(本质上是位于 TCP/IP 之上的通信协议)
支持 .pl、.cgi 等是 Application Server 的角色。有很多很好的例子。例如,在 Ruby on Rails 中,您可以使用 Web 服务器(Apache/nginx)并在这些服务器后面运行 ruby 解释器(实际上它会处理带有嵌入 Ruby 代码的 HTML)
你真的需要弄清楚你的目标是什么。
是的,你应该打电话给 exec。特别是,您可能想要运行一个 shell,它会确定 cgi 程序是什么类型的脚本(例如 perl、shell 等)或二进制文件,并正确执行它。
通常的顺序是:使用管道创建一些管道,fork 生成一个新进程,dup2 将 stdin 和 stdout 连接到管道,然后 exec(运行新程序)。
您可能会调用 exec 的 execle 变体。最后一个参数是你的 cgi 程序的一组环境变量。根据传入的请求在 cgi 规范中设置名称值对。这些将具有 和 之类的REQUEST_METHOD
名称QUERY_STRING
。
接下来,将请求内容写入 cgi 的标准输入。例如,在 POST 的情况下,这将是请求参数字符串。最后,读取标准输出并将其回显到浏览器。