(1)创建子进程,父进程退出
首先做的是调用fork,然后使父进程e x i t。这样做实现了下面几点:第一,如果该守护进程是由一条简单s h e l
l命令起动的,那么使父进程终止使得s h e l l认为这条命令已经执行完成。第二,子进程继承了父进程的进程组I D,但具有一个新的进程I
D,这就保证了子进程不是一个进程组的首进程。这对于下面就要做的setsid调用是必要的前提条件。
(2)调用setsid以创建一个新的会话,并担任该会话组的组长。调用setsid 作用有三个:
(a)成为新对话期的首进程,
(b)成为一个新进程组的首进程,
(c)脱离控制终端。
(3)改变当前目录为根目录
chdir(“/”);
从父进程继承过来的当前工作目录可能在一个mnt的文件系统中。因为守护进程通常在系统再引导之前是一直存在的,所以如果守护进程的当前工作目录在一个mnt文件系统中,那么该文件系统就不能被拆卸。
(4)重设文件权限掩码
umask(0);
由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权。例如,若守护进程要创建一个组可读、写的文件,而继承的文件方式创建屏蔽字,屏蔽了这两种许可权,则所要求的组可读、写就不能起作用。
(5) 关闭不再需要的文件描述符
用fork函数创建的子程序会从父进程那继承一些已经打开的文件,由此为使守护进程就不再持有从其父进程继承来的某些文件描述符。但是,究竟关闭哪些描述符则与具体的精灵进程有关,可以程序中的方法关闭所有文件描述符。
for (i=0;i
close(i);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#define MAXFILE 65535
int main()
{
pid_t pc;
int i,fd,len;
char *buf="This is a Dameon\n";
len =strlen(buf);
pc=fork();
if(pc<0)
{
printf("error fork\n");
exit(1);
}
else if(pc>0)
exit(0);
setsid();
chdir("/");
umask(0);
for(i=0;i<MAXFILE;i++)
close(i);
if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0)
{
perror("open");
exit(1);
}
while(1)
{
write(fd, buf, len+1);
sleep(10);
}
close(fd);
return 0;
}
|
阅读(1027) | 评论(0) | 转发(0) |