Linux下服务器+CGI+用户程序的疑问

woodyk 2008-02-01 09:04:30
小弟初学者,一直有各问题想不清楚.
按我的理解:
普通服务器完成的工作就是监听指定端口,处理客户请求,并返回结果给浏览器;
CGI的功能网上也有很多,说是主要处理客户的POST请求,解析表单信息,贴出的比较多的处理过程就是下面这个,
⑴通过Internet把用户请求送到服务器。
⑵服务器接收用户请求并交给CGI程序处理。
⑶CGI程序把处理结果传送给服务器。
⑷服务器把结果送回到用户。
在系统上还跑着用户自己的应用程序,肯定和上面两个有些交互.

我的问题是,为什么大家做这方面功能时不把这些功能集合起来呢?就是直接用用户应用程序实现web server+CGI+其他用户功能.
还是说这样做存在什么不妥?
真要是单独写CGI的话,用什么语言比较好?(Linux或嵌入式系统)
...全文
79 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
woodyk 2008-02-03
  • 打赏
  • 举报
回复
再次感谢!!
小弟已有了奋斗的方向了.:)
pilgrim_kevin 2008-02-02
  • 打赏
  • 举报
回复
上面的帖子,前面关于cgi请求的,这跟服务器端的CGI相关配置有关。比如说如果你配置了web directory 的 / 目录下 * (所有)都有CGI执行权限,那么发起任何一个http请求server都会检查你请求的资源是不是一个可执行文件(包括程序或脚本,在Unix类系统下就是具有可执行权限的文件),还是html/txt/jpg等服务器支持的mime文档,如果是可执行文件,它就会启动这个程序作为一个CGI进程。当然我举这个例子是非常不安全的,通常CGI的配置都限定在某个目录,指定某个特定的后缀,对其可访问的资源都有严格限定,乃至server在什么用户权限下运行,这些都要考虑。

传统CGI服务器都是不断fork进程,改进的技术会采用很多方法去优化性能和可靠性,比如FastCGI,还有asp/php这些脚本解释引擎,乃至更先进的层出不穷的服务器端新技术,不过这些现在不必深究,根基的原理性知识很重要。

你可以有其它的应用进程,包括一些daemon程序在跑,应用环境里几乎都是这样的,现在都是跑多任务操作系统嘛,不可能贤者只跑一个应用进程。至于进程之间的通信,这个你最好备一本<Unix环境高级编程>作参考,方式多得很,管道,FIFO,消息队列,共享内存,Socket,等等,你也可以通过文件或数据库去共享信息。
woodyk 2008-02-01
  • 打赏
  • 举报
回复
就是说响应客户端请求的活都交给web server,并且可以在web server的配置文件中指定CGI处理程序,当客户端在浏览器中输入如:http://192.168.0.102时,服务器就会自动去执行CGI处理,CGI通过进程通信再与用户应用程序交互,将处理结果直接printf或交给服务器.

上面的过程理解的是否正确??
还有CGI的处理结果是怎么送回服务器的呢?
pilgrim_kevin 2008-02-01
  • 打赏
  • 举报
回复
web server通常不需要自己重复造轮子。CGI是web server支持的。你只需要关注你的CGI程序怎么写,以及与其他进程的通信问题。把问题集中到关注应用本身。在各种限制比较严格的状况下,才需要自己去实现这些。

C是通用的,Perl是script语言,需要解释器,嵌入式系统里使用不太现实。
woodyk 2008-02-01
  • 打赏
  • 举报
回复
从以往前辈们的经验来看,怎么做最合理呢?
虽然楼上大哥说写到一起复杂度会提高,但分着写这些功能,不也一样要要处理它们之间的交互,也一样要管理吗?

单独写CGI我查找了一下,好像用C和Perl的比较多,不知道有什么不同或要注意什么吗?
pilgrim_kevin 2008-02-01
  • 打赏
  • 举报
回复
如果你能够自己写程序实现web server+CGI+其他用户功能,为何不可?至于是否有不妥,具体情况具体分析。不过你不觉得这样开发的复杂性会高吗?

在Linux下面写CGI,几乎什么语言都可以,只要它可以用来在Linux下写程序:C, Perl, Python, Shell Scripts and others。不过在嵌入式系统里,大多数情况下还是用C。
woodyk 2008-02-01
  • 打赏
  • 举报
回复
也就是说CGI程序必须有客户端用http://xxx.com/yyy.cgi,或是http://xxx.com/yyy.pl请求时才会被调用,像我上面说的http://192.168.0.102时web server是不会调用CGI的.

而且CGI只是每次被调用时运行一次就退出了.

我自己的应用程序是开机一直运行着的,所以每次客户端请求http://xxx.com/yyy.cgi,被启动的CGI只能用管道或消息队列同我的应用程序进行一些交互了.

不知道我理解的是否正确?? 大哥再给个确认!!

先结贴了.
非常感谢楼上大哥的解答,现在思路清晰多了,谢谢.
pilgrim_kevin 2008-02-01
  • 打赏
  • 举报
回复
CGI叫做通用网关协议,http server不需要去指定CGI处理程序,而是做CGI支持的相关配置就行了。当你请求一个.cgi或者服务器配置里包含的CGI资源后缀时,比如http://xxx.com/yyy.cgi,或是http://xxx.com/yyy.pl,甚至是http://xxx.com/yyy,yyy是一个可执行的CGI程序,如果http server的配置允许该CGI程序执行,那么http server会fork一个该CGI程序的进程并把浏览器请求作为标准输入重定向给该程序,至于该程序的标准输出会重定向到http server,http server再返回给brower。这里面你需要关心的只是CGI程序如何处理输入和输出,其他的是由http server完成的,不需要你关心。

至于用户应用程序,本身你写的CGI程序就是用户应用程序,你可以在里面处理很多东西,包括开启新的进程或线程。当然很多时候你的应用环境里会有一些其它的相关应用程序的进程可能需要跟你的CGI程序通信,那么这就是IPC需要处理的事情了,你可以以各种适合的方式去做这个事情,管道也好,共享内存也好,消息队列什么的,只要适用都可以。

23,218

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧