当前位置: 技术问答>linux和unix
谁能我帮解释解释daemon 函数具体步骤的意思
来源: 互联网 发布时间:2016-05-17
本文导语: 我是菜鸟啊,网上有很多daemon的写法,我随便贴个 int daemon_init() { int i; pid_t pid; if( (pid = fork())==-1) { ERR_LOG("fork error"); return -1; } if ( pid != 0) exit(0); /* parent terminates 主进程中止,下面的怎么执行下...
我是菜鸟啊,网上有很多daemon的写法,我随便贴个
int daemon_init()
{
int i;
pid_t pid;
if( (pid = fork())==-1)
{
ERR_LOG("fork error");
return -1;
}
if ( pid != 0)
exit(0); /* parent terminates 主进程中止,下面的怎么执行下去的*/
/* 41st child continues */
setsid(); /* become session leader 什么意思,为什么这么做*/
signal(SIGHUP, SIG_IGN); /*什么意思,为什么这么做*/
chdir("/"); /* change working directory *什么意思,为什么这么做,这个很意思,这行去掉,daemon状态下,打印日志才能打印,否则打印不出来,查了下,说把路径给改变了*/
umask(0); /* clear our file mode creation mask 什么意思,为什么这么做*/
close((int)STDIN_FILENO); /*什么意思,为什么这么做*/
close((int)STDOUT_FILENO); /*什么意思,为什么这么做*/
close((int)STDERR_FILENO); /*什么意思,为什么这么做*/
return 0;
}
int daemon_init()
{
int i;
pid_t pid;
if( (pid = fork())==-1)
{
ERR_LOG("fork error");
return -1;
}
if ( pid != 0)
exit(0); /* parent terminates 主进程中止,下面的怎么执行下去的*/
/* 41st child continues */
setsid(); /* become session leader 什么意思,为什么这么做*/
signal(SIGHUP, SIG_IGN); /*什么意思,为什么这么做*/
chdir("/"); /* change working directory *什么意思,为什么这么做,这个很意思,这行去掉,daemon状态下,打印日志才能打印,否则打印不出来,查了下,说把路径给改变了*/
umask(0); /* clear our file mode creation mask 什么意思,为什么这么做*/
close((int)STDIN_FILENO); /*什么意思,为什么这么做*/
close((int)STDOUT_FILENO); /*什么意思,为什么这么做*/
close((int)STDERR_FILENO); /*什么意思,为什么这么做*/
return 0;
}
|
在编写精灵进程程序时需遵循一些基本规则,以便防止产生并不希望的交互作用。下面先
说明这些规则,然后是一个按照规则编写的函数d a e m o n _ i n i t。
(1) 首先做的是调用f o r k,然后使父进程e x i t。这样做实现了下面几点:第一,如果该精灵
进程是由一条简单s h e l l命令起动的,那么使父进程终止使得s h e l l认为这条命令已经执行完成。
第二,子进程继承了父进程的进程组I D,但具有一个新的进程I D,这就保证了子进程不是一个
进程组的首进程。这对于下面就要做的s e t s i d调用是必要的前提条件。
(2) 调用s e t s i d以创建一个新对话期。于是执行9 . 5节中列举的三个操作,使调用进程:(a)
成为新对话期的首进程,(b)成为一个新进程组的首进程,(c)没有控制终端。
(3) 将当前工作目录更改为根目录。从父进程继承过来的当前工作目录可能在一个装配的
文件系统中。因为精灵进程通常在系统再引导之前是一直存在的,所以如果精灵进程的当前工
作目录在一个装配文件系统中,那么该文件系统就不能被拆卸。
另外,某些精灵进程可能会把当前工作目录更改到某个指定位置,在此位置做它们的工作。
例如,行式打印机假脱机精灵进程常常将其工作目录更改到它们的s p o o l目录上。
(4) 将文件方式创建屏蔽字设置为0。由继承得来的文件方式创建屏蔽字可能会拒绝设置某
些许可权。例如,若精灵进程要创建一个组可读、写的文件,而继承的文件方式创建屏蔽字,
屏蔽了这两种许可权,则所要求的组可读、写就不能起作用。
(5) 关闭不再需要的文件描述符。这样使精灵进程就不再持有从其父进程继承来的某些文
件描述符(父进程可能是s h e l l进程,或某个其他进程)。但是,究竟关闭哪些描述符则与具体
的精灵进程有关,所以在下面的例子中不包含此步骤。
int daemon_init()
{
int i;
pid_t pid;
if( (pid = fork())==-1)
{
ERR_LOG("fork error");
return -1;
}
if ( pid != 0)
exit(0); /* 主进程中止没有错,但if不是还有else吗?else中就是有两种情况pid>0就是子进程
说明这些规则,然后是一个按照规则编写的函数d a e m o n _ i n i t。
(1) 首先做的是调用f o r k,然后使父进程e x i t。这样做实现了下面几点:第一,如果该精灵
进程是由一条简单s h e l l命令起动的,那么使父进程终止使得s h e l l认为这条命令已经执行完成。
第二,子进程继承了父进程的进程组I D,但具有一个新的进程I D,这就保证了子进程不是一个
进程组的首进程。这对于下面就要做的s e t s i d调用是必要的前提条件。
(2) 调用s e t s i d以创建一个新对话期。于是执行9 . 5节中列举的三个操作,使调用进程:(a)
成为新对话期的首进程,(b)成为一个新进程组的首进程,(c)没有控制终端。
(3) 将当前工作目录更改为根目录。从父进程继承过来的当前工作目录可能在一个装配的
文件系统中。因为精灵进程通常在系统再引导之前是一直存在的,所以如果精灵进程的当前工
作目录在一个装配文件系统中,那么该文件系统就不能被拆卸。
另外,某些精灵进程可能会把当前工作目录更改到某个指定位置,在此位置做它们的工作。
例如,行式打印机假脱机精灵进程常常将其工作目录更改到它们的s p o o l目录上。
(4) 将文件方式创建屏蔽字设置为0。由继承得来的文件方式创建屏蔽字可能会拒绝设置某
些许可权。例如,若精灵进程要创建一个组可读、写的文件,而继承的文件方式创建屏蔽字,
屏蔽了这两种许可权,则所要求的组可读、写就不能起作用。
(5) 关闭不再需要的文件描述符。这样使精灵进程就不再持有从其父进程继承来的某些文
件描述符(父进程可能是s h e l l进程,或某个其他进程)。但是,究竟关闭哪些描述符则与具体
的精灵进程有关,所以在下面的例子中不包含此步骤。
int daemon_init()
{
int i;
pid_t pid;
if( (pid = fork())==-1)
{
ERR_LOG("fork error");
return -1;
}
if ( pid != 0)
exit(0); /* 主进程中止没有错,但if不是还有else吗?else中就是有两种情况pid>0就是子进程