这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像咱们常常在迪斯尼动画里见到的那些,有些会飞,有些不会,常常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒霉地撞在柱子上,有时候还会想出一些小小的花招,把主人公从敌人手中救出来,正因如此,daemon有时也被译做"守护神"。因此,daemon进程在国内也有两种译法,有些人译做"精灵进程",有些人译做"守护进程",这两种称呼的出现频率都很高。shell
与真正的daemon类似,daemon进程也习惯于把本身隐藏在人们的视线以外,默默为系统作出贡献,有时人们也把它们称做"后台服务进程"。daemon进程的寿命很长,通常来讲,从它们一被执行开始,直到整个系统关闭,它们才会退出。几乎全部的服务器程序,包括咱们熟知的Apache和wu-FTP,都用daemon进程的形式实现。不少Linux下常见的命令如inetd和ftpd,末尾的字母d就是指daemon。服务器
为何必定要使用daemon进程呢?Linux中每个系统与用户进行交流的界面称为终端(terminal),每个今后终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端(Controlling terminal),当控制终端被关闭时,相应的进程都会被自动关闭。关于这点,读者能够用X-Window中的XTerm试验一下,(每个XTerm就是一个打开的终端,)咱们能够经过键入命令启动应用程序,好比:session
$netscape动画
而后咱们关闭XTerm窗口,刚刚启动的netscape窗口也会随之一同忽然蒸发。可是daemon进程却可以突破这种限制,即便对应的终端关闭,它也能在系统中长久地存在下去,若是咱们想让某个进程长命百岁,不由于用户或终端或其余的变化而受到影响,就必须把这个进程变成一个daemon进程。命令行
若是想把本身的进程变成daemon进程,咱们必须严格按照如下步骤进行:继承
下面,就然咱们亲眼看一个daemon进程的诞生:进程
/* daemon.c */资源
#include<unistd.h>terminal
#include<sys/types.h>it
#include <sys/stat.h>
#define MAXFILE 65535
main()
{
pid_t pid; int i;
pid=fork();
if(pid<0)
{
printf("error in fork\n");
exit(1);
}
else if(pid>0)
/* 父进程退出 */
exit(0);
/* 调用setsid */
setsid();
/* 切换当前目录 */
chdir("/");
/* 设置文件权限掩码 */
umask(0);
/* 关闭全部可能打开的不须要的文件 */
for(i=0;i<MAXFILE;i++)
close(i);
/*到如今为止,进程已经成为一个彻底的daemon进程,你能够在这里添加任何你要daemon作的事情*/
for(;;)
sleep(10);
}