日期:2014-05-16  浏览次数:20956 次

如何写一个Linux精灵进程

                                                                                                                                                                    --Devin Watson

     这个文档演示了如何使用gcc在linux中写一个精灵进程,使用这篇文档的前提是有Linux的知识和熟悉C语言。这篇文档的版权者是Devin Watson,使用BSD协议。

     1.引言:什么是一个精灵进程

     一个精灵进程(或服务)是一个后台进程,它被设计用来自己运行,并且很少或没有用户的干预。Apache服务器http精灵进程(httpd)就是精灵进程的一个例子,它在后台中等待,监听特定的端口,根据请求的类型提供页面或处理脚本。

     在Linux中创建一个精灵进程使用了一个有序的规则集。知道它们如何工作,将会帮助你理解精灵进程不但可以在Linux 用户态中的工作,也会和内核调用一起运行。事实上,一些精灵进程和内核模块的接口,会和硬件设备一起工作,例如全局控制板,打印机以及PDA。它们是Linux的基本构建组件之一,这使得Linux有着难以置信的灵活性和力量。

     通过这篇文档,将会使用C语言构建一个非常简单的精灵进程。我们将会一步一步的向里面添加代码,展示了设置和运行一个daemon的合适的顺序。

     2.开始

     首先,你需要使用下面的两个软件安装在你的Linux机器上,来开发精灵进程:

     (1)GCC 3.2.2 或者更高的版本

     (2)Linux 开发头文件和库

     如果你的系统还没有安装这两个软件,那么你将会需要安装它们来开发这个文档中的例子。检测你的GCC的版本,可以使用命令:

gcc --version

      3.计划你的精灵进程

          3.1 精灵进程都干了写什么

          一个精灵进程应该做一件事情,并且把它做好。这个事情可能会像管理多个域名上的成百个发件箱一样复杂,或者像写一个报告并且调用发送邮件程序将报告发送出去一样简单。

          无论如何,关于这个精灵进程做什么,你都应该有一个好的计划。如果它要和其他进程协作(这些进程可能写了或者还没有写),那么也需要考虑其他的进程。

          3.2 如何交流

          精灵进程绝不应该通过一个终端和用户交流。事实上,一个精灵进程完全不应该和一个用户直接交流。所有的交流都应该通过一些接口(你可能写了或者没有写),它可能会像GTK+GUI一样复杂,也可能像信号集一样简单。

     4.基本的精灵进程结构

     当一个精灵进程启动之后,它必须做一些底层次的工作,让它自己准备好来做它真正的工作。这包括了下面几个步骤:

(1)创建子进程,退出父进程
(2)改变文件的掩码
(3)打开日志文件,以便向里面写入执行信息
(4)创建唯一的会话ID(SID)
(5)改变当前的工作路径到一个安全的地方
(6)关闭标准文件描述符
(7)编写实际的精灵进程代码
    

          4.1 创建子进程

          一个精灵进程可以通过由系统自己启动,或者由用户通过终端或者脚本启动。当它启动后,这个进程就像系统中的其它可执行文件一样。为了让它真正的有自主权,必须创建一个子进程,这个子进程用来执行实际的代码。我们使用fork来创建子进程:

pid_t pid;
/* Fork off the parent process */
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
/* If we got a good PID, then
we can exit the parent process. */
if (pid > 0) {
exit(EXIT_SUCCESS);
}

          注意在调用fork函数之后要立即进行出错检查,当写一个精灵进程的时候,你需要使你的代码尽可能的健壮。事实上,一个精灵进程的