代码拉取完成,页面将自动刷新
LIB-ZC 支持 MASTER/SERVER 服务进程管理框架
此框架下:
举个简单的例子, 一个邮件系统有 3 个服务: smtpd, imapd, pop3d :
master/server 行为:
int main(int argc, char **argv)
{
return zmaster_server_main(argc, argv);
}
zmaster_server_main 函数根据命令参数启用相应的功能
根据参数 -C config_dir, master 程序会遍历(无序) config_dir/*.cf, 把每个配置文件(如:config/dir/imapd.cf)作为一个服务启动
例如
[xxx@zytest]$ cat some_config_dir/imapd.cf
# 服务程序
server-command = bin/imapd
# 启动的端口和服务名字(自定义)
# imapd 和 imapd-ssl 是服务名字
# 0:143, 127.0.0.1:1143, 0;993, 0:12143 是监听的网络端口, ./var/socket/imapd 是 domain socket 端口
server-service = imapd://0:143, imapd-ssl://0:993, imapd://127.0.0.1:1143, imapd://./var/socket/imapd, 0:12143
# 启动几个进程
server-proc-count = 1
# server模式下, 通用的日志配置, 可选
# syslog,mail : 使用syslog, facility 是 mail, 级别固定是 INFO
# masterlog,./var/socket/log : 内置的日志服务, 参考
# https://gitee.com/linuxmail/lib-zc/blob/master/sample/master/master.sh
server-log = syslog,mail
# 下面是其他配置, server 会读取
abc = xxx
host = linuxmail.cn
此服务模式运行在异步IO环境, 默认已经建好环境 zvar_default_aio_base
static void do_something(int fd)
{
/* fd 是 accept 后得到的文件描述符, 使用者自己处理, 最后记得要 close */
foo();
close(fd);
}
static void _service_register(const char *service_name, int fd, int fd_type)
{
/* service_name 就是上面的 imapd, imapd-ssl */
/* fd 是 从 master 继承的监听端口, 应该通过 accept 处理 */
/* fd_type 可选 zvar_tcp_listen_type_inet, zvar_tcp_listen_type_unix */
/* 下面这个函数是一个通用的, 简单的处理机制 */
zaio_server_general_aio_register(zvar_default_aio_base, fd, fd_type, do_something);
}
int main(int argc, char **argv)
{
zaio_server_service_register = _service_register;
return zaio_server_main(argc, argv);
}
fd2 = accept(fd);
callback(fd2);
见上文的 some_config_dir/imapd.cf
程序启动后, 会(无序)加载 some_config_dir/*.gcf, 然后再加载 some_config_dir/imapd.cf
此服务模式运行在协程环境
static void *do_accept(void *ctx)
{
int sock = (int)(long)ctx;
while (1) {
int fd = accpet(fd);
foo();
close(fd);
}
return 0;
}
static void _service_register(const char *service_name, int fd, int fd_type)
{
/* service_name 就是上面的 imapd, imapd-ssl */
/* fd 是 从 master 继承的监听端口, 应该通过 accept 处理 */
/* fd_type 可选 zvar_tcp_listen_type_inet, zvar_tcp_listen_type_unix */
/* 大部分情况下, 这个 fd 需要 accpet, 一般通过启动新的协程来处理 */
zcoroutine_go(do_accept, (void *)(long)fd, 0);
}
int main(int argc, char **argv)
{
zcoroutine_server_service_register = _service_register;
return zcoroutine_server_main(argc, argv);
}
通用参数配置风格
./some_server alone \
[ -server-service imapd://0:143,0:1143,imapd-ssl://0:993 ] \
[ -server-config-path ./etc/service/ ] \ # 加载全局配置 ./etc/service/*.gcf
[ -config ./etc/service/imapd.cf ] \
[ ... ]
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。