Chinaunix首页 | 论坛 | 博客
  • 博客访问: 572766
  • 博文数量: 107
  • 博客积分: 3079
  • 博客等级: 少校
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-08 00:03
个人简介

emmoblin.github.com

文章分类

全部博文(107)

文章存档

2012年(8)

2011年(15)

2010年(49)

2009年(9)

2008年(26)

分类: LINUX

2008-11-29 17:12:55

(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) |
给主人留下些什么吧!~~