原文链接
(二)对服务的深入讨论之上
上一章其实只是概括性的介绍,下面开始才是真正的细节所在。在进入点函数里面要完成
!" 的初始化,准确点说是初始化一个 !#$%&'#()*+##,($- 结构数组,这个结
构记录了这个服务程序里面所包含的所有服务的名称和服务的进入点函数,下面是一个
!#$%&'#()*+##,($- 的例子:
!#$%&'#()*+##,($-./01
2
3324".5(674857"98
3324".:748:98
332,;++8,;++98
9<
第一个成员代表服务的名字,第二个成员是 !" 回调函数的地址,上面的服务程
序因为拥有两个服务,所以有三个 !#$%&'#()*+##,($- 元素,前两个用于服务,最后的
,;++ 指明数组的结束。
接下来这个数组的地址被传递到 !!'= 函数:
*>>+3!!'=?
+6!#$%&'#()*+##,($-!!(
@
这个 AB 函数表明可执行文件的进程怎样通知 !'" 包含在这个进程中的服务。就像上
一章中讲的那样,!!'= 为每一个传递到它的数组中的非空元素产生
一个新的线程,每一个进程开始执行由数组元素中的 !!( 指明的
!" 函数。
!'" 启动一个服务程序之后,它会等待该程序的主线程去调
!!'=。如果那个函数在两分钟内没有被调用,!'" 将会认为这个服
务有问题,并调用 (6 去杀死这个进程。这就要求你的主线程要尽可能快的调
用 !!'=。
!!'= 函数则并不立即返回,相反它会驻留在一个循环内。当在
该循环内时,!!'= 悬挂起自己,等待下面两个事件中的一个发生。
第一,如果 !'" 要去送一个控制通知给运行在这个进程内一个服务的时候,这个线程就会激
活。当控制通知到达后,线程激活并调用相应服务的 ':7 函数。':7 函数处
理这个服务控制通知,并返回到
!!'=。!!'= 循环回去后再一次悬挂自己。
第二,如果服务线程中的一个服务中止,这个线程也将激活。在这种情况下,该进程将运
行在它里面的服务数减一。如果服务数为零,!!'= 就会返回到入口
点函数,以便能够执行任何与进程有关的清除工作并结束进程。如果还有服务在运行,哪怕只
是一个服务,!!'= 也会继续循环下去,继续等待其它的控制通知或
者剩下的服务线程中止。
上面的内容是关于入口点函数的,下面的内容则是关于 !" 函数的。还记得以前
讲过的 !" 函数的的原型吗?但实际上一个 !" 函数通常忽略传递给它的
评论2