创建守护进程fork一次与fork两次的区别

62 篇文章 56 订阅
56 篇文章 1 订阅

1、守护进程的特点
1.1、独立于控制终端。
1.2、父进程是1号进程(init),所以守护进程也是孤儿进程
1.3、守护进程是独自成组进程的。
1.4、守护进程独自成一个成为会话的会话首进程,或者是一个会话中的某个进程组。
1.5、守护进程的运行不受用户登录和注销的影响。

2、为什么要有守护进程???
控制终端因为某些原因会发送一些信号,接受到信号的进程去执行这些信号的默认处理动作会导致进程退出。这就使得进程不能正常的处理某些任务,所以就需要像守护进程这样接受不到信号的进程。让进程独立与控制终端,执行某些任务或处理某些事件。

3、创建一个简单的守护进程
步骤:
1、调用umask将权限掩码设置为0
2、调用fork,父进程退出,保证子进程不会使一个进程组的组长。
3、调用setsid创建一个新的会话。(还可以再fork一次)
4、将当前创建目录改为根目录
5、关闭不需要的文件描述符。(守护进程独立于控制终端)
6、忽略SIGCHLD信号。

//fork一次

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
void mydaemon()
{
    umask(0);
    if(fork()>0)
        exit(1);   
    setsid();
    chdir("/");
    close(0);
    close(1);
    close(2);
    signal(SIGCHLD,SIG_IGN);
}
int main()
{
    mydaemon();
    while(1)
    {
        sleep(1);
    }
    return 0;
}

结果:
可以看到,进程组id和会话id与pid相同。
这里写图片描述

//fork两次
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<signal.h>
void mydaemon()
{
    umask(0);
    if(fork()>0)
        exit(1);   
    setsid();
    if(fork()>0)
        exit(1);       
    chdir("/");
    close(0);
    close(1);
    close(2);
    signal(SIGCHLD,SIG_IGN);
}
int main()
{
    mydaemon();
    while(1)
    {
        sleep(1);
    }
    return 0;
}

结果:
这里写图片描述
可以看到,进程组id和会话id都与pid不同。

4、创建守护进程的时候fork一次与fork两次有什么区别
实际上创建守护进程的过程中fork一次可以,fork两次也可以。最主要的区别就是fork一次的话守护进程pid和gid和sid都是相同的,表示当前守护进程自成会话,自成进程组。而fork两次的话,pid与gid和sid不同,这表明守护进程是属于某个会话,属于某个进程组。
这里写图片描述
可以看到,fork两次的话,会使得守护进程更加安全。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值