4.4 single_server.c,multi_server.c,trigger_server.c:业务模块服务模板
2016-04-07 11:01
453 查看
postfix中的业务模块大体分为3类:一次服务一个客户的模块、同时服务多个客户的模块、需要触发唤醒的模块。由于相同类型的模块要执行许多相同的操作,所以postfix建立了single_server.c,multi_server.c,trigger_server.c 3个模板来处理这三种情况。(event_server.c也是一种业务模板,但应用该模板的业务模块我们不讨论,所以我们也不讨论这种模板)。
在业务模块中使用服务模板:
smtpd.c的main函数:
single_server_main(argc,argv, smtpd_service,
…
qmgr.c的main函数:
trigger_server_main(argc,argv, qmgr_trigger_event,
…
anvil.c的main函数:
multi_server_main(argc,argv, anvil_service,
…
single_server.c模板一次服务一个客户。累积服务过的客户达到max_use,或长时间没有得到则退出。所以在服务器上如果观察一下采用single_server.c模板的模块,如smtpd,其运行时间并不会很久(比如几小时前)。
multi_server.c模板可以同时服务多个客户(利用多路复用函数),所以使用multi_server.c做模板的用于统计的anvil模块可以统计客户端并发连接数之类的并发量。
trigger_server.c的回调函数trigger_server_accept只可能会挂载到trigger_server_accept_local或trigger_server_accept_fifo,即不接收网络请求。而single_server.c的回调函数single_server_accept还可能会被挂载到single_server_accept_inet。“trigger”意味着会被I/O唤醒但不会提供会话:
/* DESCRIPTION
/* Thismodule implements a skeleton for triggered
/* mailsubsystems: mail subsystem programs that wake up on
/* clientrequest and perform some activity without further
/* clientinteraction.
在qmgr_post_init函数中,设置了
* Prevent automatic process suicide after a limited number of client requests or after a limited amount of idletime.
var_use_limit =0;
var_use_limit即参数max_use。也即trigger_server.c业务模板不会像single_server.c模板一样服务了一定请求后退出。所以采用该模板的模块的生命周期可能会很长,甚至于可能和master模块一样长。可以在生产系统上对比一下qmgr模块和master模块的启动时间。使用trigger_server.c模板的模块将会持久运行的特性决定了第六章的qmgr模块将会精心的安排数据结构来节省内存占用。
我们讨论的模块会用到这三种模板:
smtpd、cleanup、virtual模块使用single_server模板。
qmgr模块使用trigger_server模板。
avail、trivial-rewrite模块使用multi_server模板。
single_server.c、multi_server.c、trigger_server.c这3个模板的“main”函数(这3个程序其实是没有main函数的,其single_server_main、multi_server_main、trigger_server_main函数被业务模块的main函数调用)部分有众多的相同的代码——因为都要完成诸如读取环境变量和参数、屏蔽某些信号、初始化日志、版本检查、初始化参数、开启调试等功能。这些代码也同master.c中的main函数中的类似代码完成同样的功能——当然不包括master.c的main函数中为守护进程而进行的设置。这些操作见4.1.4。
这3个模板提供两种服务:一种直接和控制台交互。比如smtpd模块可以接收来自网络的请求,或者允许用户通过sendmail –bs命令通过控制台命令行使用服务。另一种通过网络提供服务。single_server.c将这两种服务方式称为one-shot server(通过sendmail –bs命令服务)和semi-resident server(通过网络服务)。
single_server.c的single_server_wakeup函数会直接执行single_server_service,即使用该模板的模块的回调函数,比如smtpd.c的回调函数smtpd_service、cleanup.c的回调函数cleanup_server,而multi_server.c的multi_server_wakeup会执行
event_enable_read(vstream_fileno(stream),multi_server_execute, (void *) stream);
将业务模块委托给模板执行的回调函数放在事件循环中执行,达到同时服务多个请求的目的。
我们以single_server.c模板为例介绍一下服务模板。
在业务模块中使用服务模板:
smtpd.c的main函数:
single_server_main(argc,argv, smtpd_service,
…
qmgr.c的main函数:
trigger_server_main(argc,argv, qmgr_trigger_event,
…
anvil.c的main函数:
multi_server_main(argc,argv, anvil_service,
…
single_server.c模板一次服务一个客户。累积服务过的客户达到max_use,或长时间没有得到则退出。所以在服务器上如果观察一下采用single_server.c模板的模块,如smtpd,其运行时间并不会很久(比如几小时前)。
multi_server.c模板可以同时服务多个客户(利用多路复用函数),所以使用multi_server.c做模板的用于统计的anvil模块可以统计客户端并发连接数之类的并发量。
trigger_server.c的回调函数trigger_server_accept只可能会挂载到trigger_server_accept_local或trigger_server_accept_fifo,即不接收网络请求。而single_server.c的回调函数single_server_accept还可能会被挂载到single_server_accept_inet。“trigger”意味着会被I/O唤醒但不会提供会话:
/* DESCRIPTION
/* Thismodule implements a skeleton for triggered
/* mailsubsystems: mail subsystem programs that wake up on
/* clientrequest and perform some activity without further
/* clientinteraction.
在qmgr_post_init函数中,设置了
* Prevent automatic process suicide after a limited number of client requests or after a limited amount of idletime.
var_use_limit =0;
var_use_limit即参数max_use。也即trigger_server.c业务模板不会像single_server.c模板一样服务了一定请求后退出。所以采用该模板的模块的生命周期可能会很长,甚至于可能和master模块一样长。可以在生产系统上对比一下qmgr模块和master模块的启动时间。使用trigger_server.c模板的模块将会持久运行的特性决定了第六章的qmgr模块将会精心的安排数据结构来节省内存占用。
我们讨论的模块会用到这三种模板:
smtpd、cleanup、virtual模块使用single_server模板。
qmgr模块使用trigger_server模板。
avail、trivial-rewrite模块使用multi_server模板。
single_server.c、multi_server.c、trigger_server.c这3个模板的“main”函数(这3个程序其实是没有main函数的,其single_server_main、multi_server_main、trigger_server_main函数被业务模块的main函数调用)部分有众多的相同的代码——因为都要完成诸如读取环境变量和参数、屏蔽某些信号、初始化日志、版本检查、初始化参数、开启调试等功能。这些代码也同master.c中的main函数中的类似代码完成同样的功能——当然不包括master.c的main函数中为守护进程而进行的设置。这些操作见4.1.4。
这3个模板提供两种服务:一种直接和控制台交互。比如smtpd模块可以接收来自网络的请求,或者允许用户通过sendmail –bs命令通过控制台命令行使用服务。另一种通过网络提供服务。single_server.c将这两种服务方式称为one-shot server(通过sendmail –bs命令服务)和semi-resident server(通过网络服务)。
single_server.c的single_server_wakeup函数会直接执行single_server_service,即使用该模板的模块的回调函数,比如smtpd.c的回调函数smtpd_service、cleanup.c的回调函数cleanup_server,而multi_server.c的multi_server_wakeup会执行
event_enable_read(vstream_fileno(stream),multi_server_execute, (void *) stream);
将业务模块委托给模板执行的回调函数放在事件循环中执行,达到同时服务多个请求的目的。
我们以single_server.c模板为例介绍一下服务模板。
相关文章推荐
- 删除链表中全部值为k的节点
- curl 详解
- 多重继承时的虚函数表
- 数据库(Mysql)之count(column),count(1),count(*)用法
- gitignore忽略规则
- CSS 的命名和书写
- Python list方法总结
- 指向对象的指针变量
- Python re模块
- 大型网站架构系列:分布式消息队列
- LeetCode Valid Parentheses
- 魅族干货!如何从视觉设计师的角度做竞品分析?
- http协议简述
- Shiro学习(9)JSP标签
- Mac 下AppRTCDemo xcode 工程搭建和webrtc源码下载
- Caffe深度学习框架上手教程
- POJ3278-Catch That Cow
- 献给和我合作的过得前端童靴们:jquery源码分析--核心函数(创建jquery空对象)
- 上传图片配置文件长度和宽度大小的说明
- Test Bench基础知识笔记