守护进程

1.守护进程

守护进程创建

1.fork创建子进程,父进程终止,让子进程在后台继续执行。(产生孤儿进程)

2.子进程调用setsid产生新会话期并失去控制终端调用的setsid()使子进程进程成为新会话组长和新的进程组长。

setsid 目的:由于创建守护进程第一步调用了fork ,父进程的会话期,进程组,也被子进程拷贝了。setsid函数就是为了使得它完全独立开来,从而摆脱其他进程的控制。

3.将工作路径改成根目录。这样 防止文件被删除之后,出问题

4.重设文件权限掩码

5.关闭不需要的文件描述符,使得守护进程不再持有其父进程继承来的某些文件描述符。

6退出利用kill命令

 

或者这么描述

1、调用umask()将文件模式创建屏蔽字设置为0; 2、调用fork,父进程退出。//1、保证守护进程不是进程组长 3、调用setsid创建一个会话。//setsid会导致:1、调用进程成为新会话的首进程,2、调用进程成为一个进程组的组长进程,3、调用进程没有控制终端。 4、将当前工作目录更改我根目录。//系统中除了跟目录都可以被删除 5、关闭不在需要的文件描述符 6、忽略SIGCHLD信号

 

代码实现

void mydaemon()                 //只fork()一次
{
    umask(0);                   //用umask将文件模式创建为屏蔽字为0
    if(fork() == 0)             //fork子进程,关闭父进程
    {}
    else
    {
        exit(0);
    }
    setsid();                   //让子进程成为一个守护进程
    chdir("/");                 //更改当前目录为根目录
    close(0);                   //关闭默认的文件描述符表
    close(1);
    close(2);
    signal(SIGCHLD, SIG_DFL);   //忽略SIGCHLD信号
}
int main()
{

    mydaemon();
//  daemon(0, 0);                //系统自己定义的守护进程,没有关闭它的默认的文件描述符表,两个参数(默认更改路径到'/', 不关闭文件描述符表)

    while(1)
    {}
    return 0;
}

 

2.守护进程的作用

大部分都是服务器,就是有事情来了,它就一处理,没事就睡觉。

 

 

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页