ACL编程之父子进程机制,父进程守护子进程以防止子进程异常退出
在WIN32平台进行编程时,经常会遇到工作进程因为程序内部BUG而异常退出的现象,当然为了解决此类问题最好还是找到问题所在并解决它,但如果这类导致程序崩溃的BUG并不是经常出现,只有当某种条件发生时才会有,在我们解决BUG的时间里,为了尽最大可能地为用户提供服务可以采用一种父进程守护机制:当子进程异常退出时,守护父进程可以截获这一消息,并立即重启子进程,这样用户就可以继续使用我们的程序了,当然如果子进程的问题比较严重频繁地 DOWN掉,而父进程却不停地重启子进程的话,势必造成用户机系统资源的大量耗费,那我们的程序就如病毒一样,很快耗尽了用户机资源,所以需要父进程能够智能地控制重启子进程的时间间隔。
本文将给出一个具体的例子(利用ACL库),介绍父、子进程的编程方法。
一、接口介绍
1.1 以守护进程方式运行的接口
创建守护进程的方式非常简单,只需要调用 acl_proctl_deamon_init, acl_proctl_daemon_loop 两个函数即可
接口说明如下:
1 |
|
1.2 以命令方式来控制守护进程(守护进程即控制进程的意思)
守护进程启动后,可以以命令方式控制守护进程来启动、停止子进程,或查询显示当前正在运行的子进程。
启动子进程:acl_proctl_start_one
停止子进程:acl_proctl_stop_one
停止所有子进程:acl_proctl_stop_all
查询子进程是否在运行:acl_proctl_probe
查询当前所有在运行的子进程:acl_proctl_list
通过守护进程停止所有子进程且守护进程自身退出:acl_proctl_quit
接口说明如下:
1 |
|
1.3、子进程编写
子进程编程也比较容易,只需在程序初始化时调用 acl_proctl_child 即可,这样子进程就会在硬盘创建自己的信息并与父进程(即守护进程)建立联系。
接口说明:
1 |
|
二、例子
2.1、父进程
程序名:acl_project\samples\proctl\proctld.cpp
1 |
|
2.2、子进程
acl_project\samples\proctl\proctlc.cpp
1 |
|
2.3、编译、运行
可以打开 acl_project\win32_build\vc\samples\samples_vc2003.sln,编译其中的 proctlc, proctld 两个工程,便会生成两个可执行文件:proctlc.exe(子进程程序),proctld.exe(父进程程序)。
先让父进程以守护进程模式启动 proctld.exe,然后运行 proctld.exe -d START {path}/proctlc.exe 通知父进程启动子进程;可以运行 proctld.exe -d LIST 列出当前正在运行的子进程,运行 proctld.exe -d PROBE {path}/proctld.exe 判断子进程是否在运行,运行 proctld.exe -d STOP {path}/proctld.exe 让守护父进程停止子进程,运行 proctld.exe -d QUID 使守护进程停止所有子进程并自动退出。
另外,从子进程的程序可以看出,每隔5秒子进程就会异常退出,则守护进程便会立即重启该子进程,如果子进程死的过于频繁,则守护进程会延迟重启子进程,以防止太过耗费系统资源。
三、小结
因为有守护进程保护,就不必担心子进程(即你的工作进程)异常崩溃了,这种父子进程模型可以应用于大多数工作子进程偶尔异常崩溃的情形,如果你的程序 BUG太多,每一会儿就崩溃好多次,建议你还是先把主要问题解决后再使用父子进程,毕竟如果你的程序太过脆弱,虽然父进程能不断地重启你的程序,但你还是不能为用户提供正常服务。这种模型适用于在WIN32平台下,你的程序可能写得比较复杂,程序基本上是比较健壮的,只是会因偶尔某些原因而异常退出的情况。
github:https://github.com/acl-dev/acl
gitee:https://gitee.com/acl-dev/acl