许多程序员说精灵(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);
   }