2011年5月25日星期三

  Linux编程:信号

创建守护进程函数:

int daemon_init(void)
{
    int max_fd, ret;
    int iRet;
    struct sigaction act;

    int i;
    if ((iRet = fork()) < 0)
    {
        printf("创建守护进程错误!\n");
        _exit(4);
    }
    else if (iRet != 0)
    {
        _exit(0);
    }
    else if (setsid() < 0)//创建守护进程最关键的一步是调用setsid函数创建一个新的Session,并成为Session Leader。
    {
        _exit(5);
    }
    /*忽略父进程退出信号*/
    act.sa_handler = SIG_IGN;
    sigemptyset(&act.sa_mask);

//函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号。
    act.sa_flags = 0;
    sigaction(SIGHUP, &act, NULL);

//sigaction函数可以读取和修改与指定信号相关联的处理动作。
    if ((ret = fork()) < 0)
    {
        _exit(4);
    }
    else if (ret != 0)
    {
        _exit(0);
    }
    /*改变进程工作路径*/
    /*printf("pub74\n");*/
    /*chdir("/");*/
    /*printf("pub76\n");*/
    umask(0);
    setpgrp();
    /*    open("dev/null",O_RDWR);*/
    /*dup(1);
     dup(2);*/dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    /*设置信号,父进程不预回收子进程信息,防止产生僵死进程*/
    /*信号 SIGCHLD 的信号定位为 SIG_IGN,则调用进程的子进程在终
     止时不会变成僵死进程.调用进程也不用等待子进程返回并做相
     应处理.
     add:如果一个进程已经终止,但是它的父进程尚未调用wait或waitpid对它进行清理,这时的进程状态称为僵尸(Zombie)进程    */
    return 0;
}

没有评论:

发表评论