守护进程

守护进程

1、守护进程也称精灵进程(daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。Linux的大多数服务器就是用守护进程实现的。比如,ftp服务器,ssh服务器,Web服务器httpd等。同时,守护进程完成许多系统任务,比如,作业规划进程crond等。

2、 Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止但系统服务进程(守护进程)不受用户登录注销的影响,它们一直在运行着。

3、
(1)凡是TPGID一栏写着-1的都是没有控制终端的进程。
(2)在COMMAND一列用 [ ] 括起来的名字表示内核线程,这些线程在内核里创建没有用户空间代码,因此没有程序文件名和命令行,通常以k开头的名字表示Kernel。
(3)udevd负责维护/dev 目录下的设备文件,acpid负责电池管理,syslogd负责维护 /var/log 下的日志文件。
(4)守护进程通常采用以d结尾的名字,表示Daemon。

4、创建守护进程
创建守护进程的关键是调用函数 setsid 创建一个新的会话(Session),并成为会话首进程(Session Leader)

#include<unistd.h>
pid_t setsid(void) ;
//调用成功返回新建的会话的id(也是当前进程的id),出错返回-1。

注:调用这个函数之前,当前进程不允许是进程组的组长,否则返回-1。要保证当前进程不是进程组的组长,则先fork创建一个子进程再调用 setsid 函数。进程组的组长必然是该组的第一个进程,所以子进程不可能是该组的第一个进程。

成功创建一个守护进程的标志:
(1)创建一个新的会话,当前进程成为会话首进程,当前进程的id就是会话id。
(2)创建一个新的进程租,当前进程成为进程组的组长,当前进程的id就是进程组的id。
(3)如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开文件而不是控制终端。

创建一个守护进程:

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

void mydaemon()
{
    int i;
    pid_t pid;
    int fd0;
    struct sigaction sa;

    umask(0);  //setting mask to 0
    if((pid=fork())<0)
    {
        perror("fork");
    }
    else if(pid>0)
    {
        exit(0);  //father exit
    }
    setsid();   //create a new session

    sa.sa_handler = SIG_IGN;     //ignore signal SIG_IGN
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;

    if(sigaction(SIGCHLD,&sa,NULL)<0)
    {
        return ;
    } 

    if(chdir("/")<0)
    {
        printf("child dir error\n");
        return;
    }

    close(0);
    fd0=open("/dev/null",O_RDWR);
    dup2(fd0,1);
    dup2(fd0,2);
}

int main()
{
    mydaemon();
    while(1)
    {
        sleep(1);
    }
}

这里写图片描述

关机才会使守护进程终止,注销或关闭终端守护进程不受影响,守护进程自成一个会话。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值