许多程序员说精灵(daemon)不是魔鬼(demon)。即使有时似乎象魔鬼,但你的服务器是不会由魔鬼控制的(或许你的某些用户会由魔鬼控制,但你的服务器不会)。
我们把精灵定义为一个在后台运行的程序,用于管理系统的各个功能。该词的字面意思是“介乎神与人的精灵”。诗人威廉.巴特勒.耶茨很喜欢该词的意喻及其对现实二重性的表达。他以人来看待精灵,用精灵来表达人性的另一面。你不会明白,魔鬼不存在该有多好!例如,你怎么知道你这块馅饼是大的?除非你曾有一块比这小的。
事实上,精灵这个术语源自希腊神话。古希腊人称精灵为超人,它充当神与人之间的仲裁者。这是Unix精灵为你所做的一切的最准确描述。实际上,精灵始终呆在后台随时等待调用去执行某些服务。系统上运行的某些精灵执行系统指定的每项服务。但,请不要混淆精灵和进程这两个术语。
既然精灵介于神人之间,那么人有没有可能变成精灵呢?
在unix的世界中,一般的进程能变成精灵进程吗?答案是肯定的,下面我们就一步一步揭开人到精灵的进化过程。
决裂阶段:
在这个阶段,我们必须脱离父母的怀抱,走向自己的新天地
/* 父母创造了我们
if(fork() > 0) {
/* 父母给了我们自由 */
exit(0);
}
创造阶段:
父母给我们自由身,我们可以创造自己的新天地。为了将来美好的未来,我们要做三件事情:
1)创造新的会话期,我们成为会话期的领导
2)创造新的组织(进程组),我们自己成为该组的组长
3)我们脱离终端的控制
setsid();
升华阶段:
“上善若水,水善利万物而不争。处众人之所恶,故几于道。”,作为精灵的候选人,创造了自己的组织之后,不能再以组长自居,而应把自己当成普通人。
signal(SIGHUP,SIG_IGN);
if(fork()>0){
/*毁灭原身*/
exit(0);
}
返璞归真:
chdir("/");
umask(0);
for(i=0;i<64;++i)
{
close(i);
}
圆满阶段:
经过以上各个修炼阶段,在此为止我们已经具备了精灵的各个条件。但是以上很不够,作为一个精灵,最主要的还是我们毛主席那句话:“为人民服务”。
我们应该在这个阶段把我们要做的事启动起来,做以下事情:
int service()
{
/* 有什么要求 */
data = getIncomingRequest();
/* 为人民服务 */
result = processRequest(data)
/* 对人民的所求有个交代 */
sendResponse(result);
}