创建守护进程

来源:互联网 发布:韦德场均数据 编辑:程序博客网 时间:2024/06/05 17:55
#include <sys/wait.h>int main(void)
{    pid_t pid;    if ((pid = fork()) < 0) // 小于0表示error
    {   // 创建第一个子进程        printf("fork1 error");    }
    else if (pid == 0)  // 等于0表示是子进程
    {   // 进入第一个子进程        if ((pid = fork()) < 0)    // 创建第二个子进程            printf("fork2 error");        else if (pid > 0) // 大于0表示父进程            exit(0);    // 终止第一个子进程        // 第二个子进程在睡眠2S后才执行,这样一般情况下第一个子进程会先终止        sleep(2);        // 这时,第一个子进程肯定终止了,它的父进程就自动变成了init
        // 如果有需要的话,改变从父进程继承来的环境
        setsid(); // 创建一个新会话组并担任组长,摆脱原会话、原进程组、原终端的控制; 调用失败返回-1,调用成功返回新的会话ID
        chdir("/"); // 改变当前目录为根目录
        umask(0); // 权限掩码:umask值002 所对应的文件和目录创建缺省权限分别为6 6 4(666 减 2)和7 7 5(777 减 2)
        int i;
        for(i=0; i<getdtablesize(); i++)
        {
            close(i); // 继承了已打开的文件,关闭不需要用的文件描述符
        }
        printf("second child, parent pid = %d\n", getppid());
        exit(0); // 第二个子进程,它终止后,因为它父进程结束,所以会被init进程回收,不会成为僵尸进程。    }     // 父进程等待并回收第一个子进程    if (waitpid(pid, NULL, 0) != pid)            printf("waitpid error");    // 父进程执行到这里以后,还可以执行其他的任务。
    exit(0);}
原创粉丝点击