您的位置:首页 > 其它

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模板为例介绍一下服务模板。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: