守护进程知识及示例

守护进程(Daemon进程)

与终端无关的进程,运行在后台,生存期较长,系统关闭时终止huo可以通过命令终止或通过ps找到进程用kill杀死,有的以d结尾

终端是人与电脑交互的界面:

要以管理员身份启动:service httpd start

查看命令:ps -ef|grep httpd

关闭:service httpd stop

用命令ps -axj查看常用的守护进程:

从结果可以看出守护进程没有控制终端,其终端名设置为?,终端前台进程组ID设置为-1,init进程ID为1。系统进程依赖于操作系统实现,父进程ID为0的各进程通常是内核进程,它们作为系统自举的一部分而启动。内核进程以超级用户特权运行,无控制终端,无命令行。大多数守护进程的父进程是init进程。

会话:打开一个终端,就建立了会话。关闭终端就关闭了会话。比如:两个人打电话就建立了会话,挂掉电话就关闭了会话。一般以整个会话运行起来的第一个进程的id命名会话(一般为shell)。

进程组:一个进程组里面有一个或多个进程。一般以组长进程id命名进程组。比如:ls为一个进程组,ls即为组长也为组员,ls命令结束进程组也结束。

会话包括一个或多个进程组,一个进程组包括一个或多个进程。

获得会话id:getsid();

获得进程组id:getpgid();

获得进程id:getpid();

参数传0,表示当前会话或进程。

守护进程的创建流程:

1.fork();创建子进程,退出父进程。只有组员才能创建新会话。

2.setsid();创建新会话,进程变成会话首进程,组长。

3.chdir();将当前工作目录更改为根目录。进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。

4.调用umask将文件模式创建屏蔽字设置为0。因为进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。为防止这一点,将文件创建掩模清除:调用umask(0)。

5.close();进程从父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。

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

int main()
{
    pid_t pid=fork();
    if(pid!=0)
    {
        exit(0);
    }
    setsid();

    pid=fork();
    if(pid!=0)
    {
        exit(0);
    }

    chdir("/");

    umask(0);

    int i=0;
    for(; i<getdtablesize(); i++)
    {
        close(i);
    }
///////////////////////////////////////////////////////////////
//守护程序写完,下面是要做什么事
//////////////////////////////////////////////////////////////
    while(1)
    {
        FILE *fp=fopen("/tmp/mytest.log","a");
        assert(fp != NULL);

        time_t t;
        time(&t);
        fprintf(fp,"time is:%s", localtime(&t));
        fclose(fp);
        sleep(5);
    }
}

测试

Kill守护进程

拷贝文件到/etc/init.d底下,可以使用service daemond start启动自己写的守护进程

时间: 2024-11-09 02:40:01

守护进程知识及示例的相关文章

守护进程重读配置文件示例

重读APUE,对守护进程有了更加深刻的理解,特别是相应的编程规则和应用场景.对于为什么要fork两次,日志设施的用法,信号的处理方法都有了更加清晰的认识.通常的应用场景是,守护进程在收到一个SIGHUP信号的时候重新读取配置文件,而不需要停止.下面是运行APUE书中这个实例的过程. 首先主要代码为(reread.c): #include "util.h" #include <pthread.h> #include <syslog.h> sigset_t mask

python学习笔记——守护进程

1 基本描述 守护进程:是系统中独立的后台服务进程, 特点:独立与终端并且周期性地执行某个任务,其生命周期长,一般随系统启动和终止. 缺点:进程的创建和销毁的时候需要消耗较多的计算机资源. 2 参考 Python实现守护进程 python中的daemon守护进程实现方法 python daemon守护进程实现 Python 守护进程 Python如何实现守护进程的方法示例 Python实例浅谈之五Python守护进程和脚本单例运行 原文地址:https://www.cnblogs.com/gen

linux 创建守护进程的相关知识

linux 创建守护进程的相关知识 http://www.114390.com/article/46410.htm linux 创建守护进程的相关知识,这篇文章主要介绍了linux 创建守护进程的相关知识,需要的朋友可以参考下 关键字:linux.守护进程 创建子进程,父进程退出 这是编写守护进程的第一步.由于守护进程是脱离控制终端的,因此,完成第一步后就会在Shell终端里造成一程序已经运行完毕的假象.之后的所有工作都在子进程中完成,而用户在Shell终端里则可以执行其他命令,从而在形式上做到

ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识)

原文:ASP.NET Core Linux下为 dotnet 创建守护进程(必备知识) 前言 在上篇文章中介绍了如何在 Docker 容器中部署我们的 asp.net core 应用程序,本篇主要是怎么样为我们在 Linux 或者 macOs 中部署的 dotnet 程序创建一个守护进程,来保证我们的程序在异常或者是电脑重启的时候仍然能够正常访问. 如果你以后用准备使用 asp.net core来开发项目的话,程序并且部署到 Linux 上的话,那么此篇文章你值得收藏. 如果你觉得对你有帮助的话

守护进程接收终端输入的一种变通性方法

说明 本文主要介绍某嵌入式产品中DSL用户态驱动模块作为守护进程时,如何接收终端输入的变通性方法. 出于信息安全考虑,文中涉及系统方面的接口函数未给出实现细节,但不影响表述的完整性. 相关性文章参见<GNU Readline库函数的应用示例>. 一  背景知识 init进程(如Busybox init)是嵌入式系统内核自举时启动的第一个也是惟一的用户进程.init进程是后续所有其他进程的父进程(其进程ID为1),在系统运行期间以守护进程的形式一直存在.它主要负责启动各运行层次特定的系统服务(如

Python实例浅谈之五Python守护进程和脚本单例运行

一.简介 守护进程最重要的特性是后台运行:它必须与其运行前的环境隔离开来,这些环境包括未关闭的文件描述符.控制终端.会话和进程组.工作目录以及文件创建掩码等:它可以在系统启动时从启动脚本/etc/rc.d中启动,可以由inetd守护进程启动,也可以有作业规划进程crond启动,还可以由用户终端(通常是shell)执行. Python有时需要保证只运行一个脚本实例,以避免数据的冲突. 二.Python守护进程 1.函数实现 #!/usr/bin/env python #coding: utf-8

C#开发Linux守护进程

C#开发Linux守护进程 Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这个技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述符共享,父子进程通讯.控制等方面,是实现Linux大型服务的基础技术之一. 去年我也曾写了一篇关于守护进程的帖子,名字叫<.NET跨平台实践:用C#开发Linux守护进程>,这篇文章的的确确实现了一个Daemon,不过,它有一个弱点,不能运行多

crond守护进程

Linux系统任务计划/etc/crontab cron的主配置文件,可以定义PATHcron格式如下:# .----------------分钟 (0 - 59)# | .------------- 小时 (0 - 23)# | | .---------- 日 (1 - 31)# | | | .------- 月 (1 - 12)# | | | | .---- 周 (0 - 6) (周日=0 or 7) # | | | | |# * * * * * user-name command to b

创建守护进程

在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.守护进程是在后台运行不与任何控制终端关联,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.大多数服务都是通过守护进程实现的.它从被执行开始运转,直到整个系统关闭时才退出.如果想让某个进程不因为用户或终端或其他地变化而受到影响,那么就必须把这个进程变成一个守护进程. 通过一系列的操作,可以把一个普通进程转变位守护进程. 1.调用um