守护进程详细解读

守护进程概念

守护进程也称精灵进程,是运行在后台的一种特殊进程。他独立于终端并且周期性执行某种任务或者等待某件事情的发生。守护进程是一种很有用的进程。比如很多的服务器都是以次方是运行在后台,等待客户端连接并处理相关问题的。

系统中守护进程通常以d结尾标识。

创建守护进程关键的一步是调用setsid函数创建一个新的会话,并使之称为控制进程。

注:调用setsid创建守护进程的当前进程不得是进程组的leader,否则返回-1;保证这个条件的方式是:我们在当前进程进行fork生成子进程,父进程直接退出,子进程调用setsid就可以了。

成功调用setsid函数的结果是:

1。创建一个新的会话,并且当前进程称为leader,当前进程id为会话id

2。创建一个新的进程组,当前进程是进程组的leader,当前进程id就是进程组id

3。如果当前进程原本有一个控制终端,那么他失去这个终端称为一个没有终端控制的进程。

创建守护进程

1调用umask将文件屏蔽字设置为0

2调用fork,父进程退出

3调用setsid创建会话:结果1调用进程成为会话首进程,2调用进程成为进程组组长,3调用进程没有控制终端

4将当前目录更改为根目录

5关闭不必要的文件描述符

6忽略SIGCHID信号

生成守护进程代码

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

void my_daemon()
{
    int i;
    int fd0;
    pid_t pid;
    struct sigaction sa;
    umask(0); //设置文文件掩码为0
    if( (pid = fork()) < 0 )
    {

    }else if (pid != 0)
    {
        exit(0); //终止止父父进程
    }
    setsid(); //设置新会话
    sa.sa_handler = SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if( sigaction(SIGCHLD, &sa, NULL ) < 0 )
    { // 注册子子进程退出忽略信号
        return;
    }
    if( (pid = fork())<0)
    {
     //再次fork,终止止父父进程,保持子子进程不是话首首进程,从而而保证后续    不会在和其他终端关联
        printf("fork error!\n");
        return;
    }else if( pid != 0)
    {
        exit(0);
    }
    if( chdir("/") < 0 )
    {//更改工工作目目录到根
        printf("child dir error\n");
        return;
    }
    close(0);
    fd0 = open("/dev/null", O_RDWR); // 关闭标准输入入,重定向所有标准(输入入输出错误)    到/dev/null
    dup2(fd0, 1);
    dup2(fd0, 2);
}
int main(int argc, char const *argv[])
{
    my_daemon();
    while(1)
        sleep(1);
    return 0;
}

注:以上代码,是根据定义方式,自己实现的守护进程设置过程。

#include <stdio.h>
#include <unistd.h>

int main(int argc, char const *argv[])
{
    daemon(0,0);
    while(1);
    return 0;
}

这个则是系统中提供的设置守护进程的函数。

由图我们可以看到,守护进程是脱离终端的。

时间: 2024-11-18 12:09:22

守护进程详细解读的相关文章

守护进程详细总结

1. 守护进程的概念: 守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭.但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端

linux守护进程解读

Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, syslogd 1. NetworkManager, NetworkManagerDispatcher NetworkManager 是一个自动切换网络连接的后台进程.很多笔记本用户都需要启用该功能,它让你能够在无线网络和有线网络之间切换.大多数台式机用户应该关闭该服务.一些 DHCP 用户可能需要开启它. 2. acpid 配置文件:/proc/ac

linux 守护进程(daemon process)代码-详细注释

1.进程组 组长不能创建新的 会话 2.会话首领可以重新打开控制终端 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <sys/param.h> 5 #include <sys/stat.h> 6 #include <sys/types.h> 7 #include <fcntl.h> 8 #include <sig

守护进程模型创建思路及详细实现代码

Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件,一般采用以d结尾的名字. 特点: 没有控制终端,不能直接和用户交互,不受用户登录,注销的影响,一直运行着 创建守护进程模型: 1,创建子进程,父进程退出 2,在子进程中创建新会话,可使用setsid()函数,使子进程完全独立 3,改变当前目录为根目录,可使用chdir()函数,防止占用可卸载的文件系统 4,重设文件权限掩码,umask()函数 ,防止继承的文件创建屏蔽某些

Ehcache详细解读

Ehcache详细解读 Ehcache  是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的.网上中文的EhCache材料以简单介绍和配置方法居多,如果你有这方面的问题,请自行google:对于API,官网上介绍已经非常清楚,请参见官网:但是很少见到特性说明和对实现原理的分析,因此在这篇文章里面,我会详细介绍和分析EhCache的特性,加上一些自己的理解和思考,希望对缓存感兴趣的朋友有所收获. 一.特性一览 ,来自官网,简单翻译一下

MemCache超详细解读

MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度.MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串.对象等)所使用的key-value存储,数据可以来自数据库调用.API调用,或者页面渲染的结果.MemCache设计理念就是小而强大,它简单的设计促进了快速部署.易于开发并解决面对大规模的数据缓存的

c#实现的守护进程

这段时间在做一个关于数据交互的项目.接收到客户发送过来的文件后,通过Windows服务将文件按一定的规则分发到不同的MQ消息队列,然后再由不同的处理程序处理.虽然在编码中尽可能的考虑到了异常以及记录了详细的日志,但是服务还是偶尔抽风停掉了,这样就造成了文件堆积,客户请求得不到及时的响应.所以需要一个守护进程来保证服务始终是启动状态的. 首先,要保证需要监控的进程可配置,以及指定日志的保存位置.在App.config中配置日志保存路径以及需监控进程和对应的exe可执行程序的位置(之前考虑是如果没有

nginx学习十三 初始fork和nginx守护进程ngx_daemon

学习nginx已经有一个多月了,觉得越来越吃力了,主要原因自己总结了一下:1平台是基于linux的,以前几乎没有接触过linux,而nginx使用了很多linux的函数:2就是进程,这个东西接触的也很少,linux的多进程更不用说,而现在正好看到这里,觉得异常的吃力,这不看到nginx守护进程的建立,就找资料好好学习一下,所以本文已学习fork为主要内容. 好了,先看一下nginx的守护进程的建立,然后在学习fork. http://blog.csdn.net/xiaoliangsky/arti

编写Linux/Unix守护进程

原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开发人员也想把自己的程序变成守护进程.在创建一个守护进程的时候,要接触到子进程.进程组.会晤期.信号机制.文件.目录和控制终端等多个概念.因此守护进程还是比较复杂的,在这里详细地讨论Linux/Unix的守护进程的编写,总结出八条经验,并给出应用范例. 编程要点 1.屏蔽一些有关控制终端操作的信号.防