Linux / 守护进程

@time    2019-07-14
@author  Ruo_Xiao

一、概念

守护进程是长期运行的不与终端关联的后台运行的进程。

二、栗子

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/stat.h>

//  创建守护进程。
int MyDaemon()
{
    //  创建子进程。
    switch (fork())
    {
    //  创建线程错误。
    case -1:
        return -1;
    //  创建子进程成功,直接往下运行。
    case 0:
        break;
    //  父进程直接退出。
    default:
        exit(0);
    }
    //  运行至此,子进程变成孤儿进程,由 init(systemd) 收养。
    //  子进程创建新会话,并成为进程组组长和会话领头进程,与终端脱离关联。
    if (setsid() == -1)
        return -1;
    //  设置为 0,不让其限制文件权限,以免引起混乱。
    umask(0);
    //  以读写的方式打开黑洞设备。
    int fd = open("/dev/null", O_RDWR);
    if (fd == -1)
        return -1;
    if (dup2(fd, STDIN_FILENO) == -1)
        return -1;
    if (dup2(fd, STDOUT_FILENO) == -1)
        return -1;
    if (dup2(fd, STDERR_FILENO) == -1)
        return -1;
    close(fd);
    return 0;
}

int main()
{
    if (MyDaemon() != 0)
        return 1;
    while (true)
        sleep(1);
    return 0;
}

三、其他

1、cmd 指令 

ps -axj

显示的守护进程的名字中,带“[]”的是内核守护进程,不带的则是用户级守护进程

2、守护进程不会收到来自内核的 SIGHUPSIGINITSIGWINCH 信号,如果守护进程收到该信号,说明该信号是来自其他进程的。程序员可以将这三个信号用于他用。

        在 nginx 中, 配置文件被修改之后,nginx  reload 时,就是用 SIGHUP 信号来通知 nginx 来实现上述操作的。

3、拓展

  • SIGHUP:终端关闭信号。
  • SIGINIT:Ctrl + C 。
  • SIGWINCH:终端大小改变信号。

 

(SAW:Game Over!)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值