linux 守护进程编写

Linux守护进程编写 Linux守护进程编写 环境:VMware 15 + ubuntu 16 护进程的特点 后台服务程序,随系统启动而启动。 很多系统服务通过守护进程完成。 守护进程的名字往往以字母‘d’结尾 生存周期长。系统装入时启动,系统关闭时终止。 周期性的执行某种任务或等待处理某些特别的事件。 在Linux中,每一个与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这... 阅读详情

转自:http://blog.youkuaiyun.com/zg_hover/article/details/2553321

linux编程-守护进程编写

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

  守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,
    造成不同 Unix环境下守护进程的编程规则并不一致。
    需要注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。
    下面结合一些前辈的文档和自己的例子说说守护进程的编程。


.基本概念
.进程
    .每个进程都有一个父进程
    .当子进程终止时,父进程会得到通知并能取得子进程的退出状态。
.进程组
    .每个进程也属于一个进程组
    .每个进程主都有一个进程组号,该号等于该进程组组长的PID号
    .一个进程只能为它自己或子进程设置进程组ID号
.会话期
    .对话期(session)是一个或多个进程组的集合。
    .setsid()函数可以建立一个对话期:
    如果,调用setsid的进程不是一个进程组的组长,此函数创建一个新的会话期。
    (1)此进程变成该对话期的首进程
    (2)此进程变成一个新进程组的组长进程。
    (3)此进程没有控制终端,如果在调用setsid前,该进程有控制终端,那么与该终端的联系被解除。
    如果该进程是一个进程组的组长,此函数返回错误。
    (4)为了保证这一点,我们先调用fork()然后exit(),此时只有子进程在运行,
    子进程继承了父进程的进程组ID,但是进程PID却是新分配的,所以不可能是新会话的进程组的PID。
    从而保证了这一点。

    if((pid=fork())>0)  //parent
        exit(0);
    else if(pid==0){        //th1 child
        setsid();           //th1是成为会话期组长
        if(fork() ==0){     //th2不会是会话期组长(变成孤儿进程组)
            ...
        }
    }


一. 守护进程及其特性
 
    (1)守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。
    (2)其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,
    会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)
    中继承下来的。
    (3)最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,
    可以由作业规划进程crond启动,还可以由用户终端(通常是 shell)执行。
  总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。
    因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。

二. 守护进程的编程要点  (来自UEAP)

  前面讲过,不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样,
      区别在于具体的实现细节不同。这个原则就是要满足守护进程的特性。
      同时,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。编程要点如下;

1. 在后台运行。
  为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,
    让Daemon在子进程中后台执行。

if(pid=fork())
    exit(0); //是父进程,结束父进程,子进程继续

2. 脱离控制终端,登录会话和进程组
  进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。
    这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。
    控制终端,登录会话和进程组通常是从父进程继承下来的。
    我们的目的就是要摆脱它们,使之不受它们的影响。
    方法是在第1点的基础上,调用setsid()使进程成为会话组长:

setsid();

  说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。
    setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。
    由于会话过程对控制终端的独占性,进程同时与控制终端脱离。

3. 禁止进程重新打开控制终端
  现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。
    可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:

if(pid=fork())
     exit(0); //结束第一子进程,第二子进程继续(第二子进程不再是会话组长)

4. 关闭打开的文件描述符
  进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,
    造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们:

for(i=0;i 关闭打开的文件描述符close(i);>

5. 改变当前工作目录
  进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。
    对于需要转储核心,写运行日志的进程将工作目录改变到特定目录如 /tmpchdir("/")

6. 重设文件创建掩模
  进程从创建它的父进程那里继承了文件创建掩模。它可能修改守护进程所创建的文件的存取位。
    为防止这一点,将文件创建掩模清除:umask(0);

7. 处理SIGCHLD信号
  处理SIGCHLD信号并不是必须的。
    但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。
    如果父进程不等待子进程结束,子进程将成为僵尸进程(zombie)从而占用系统资源。
    如果父进程等待子进程结束,将增加父进程的负担,影响服务器进程的并发性能。
    在Linux下可以简单地将 SIGCHLD信号的操作设为SIG_IGN。

signal(SIGCHLD,SIG_IGN);

  这样,内核在子进程结束时不会产生僵尸进程。
    这一点与BSD4不同,BSD4下必须显式等待子进程结束才能释放僵尸进程。

三. 守护进程实例
  守护进程实例包括两部分:主程序test.c和初始化程序init.c。
    主程序每隔一分钟向/tmp目录中的日志test.log报告运行状态。
    初始化程序中的init_daemon函数负责生成守护进程。读者可以利用init_daemon函数生成自己的守护进程。

1. init.c清单

#include < unistd.h >
#include < signal.h >
#include < sys/param.h >
#include < sys/types.h >
#include < sys/stat.h >

void init_daemon(void)
{
    int pid;
    int i;
    if(pid=fork())
        exit(0);        //是父进程,结束父进程
    else if(pid< 0)
        exit(1);        //fork失败,退出
    //是第一子进程,后台继续执行
    setsid();           //第一子进程成为新的会话组长和进程组长
    //并与控制终端分离
    if(pid=fork())
        exit(0);        //是第一子进程,结束第一子进程
    else if(pid< 0)
        exit(1);        //fork失败,退出
    //是第二子进程,继续
    //第二子进程不再是会话组长
    for(i=0;i< NOFILE;++i)  //关闭打开的文件描述符
        close(i);

    chdir("/tmp");      //改变工作目录到/tmp
    umask(0);           //重设文件创建掩模
    return;
}

2. test.c清单

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

void init_daemon(void);//守护进程初始化函数

main()
{
    FILE *fp;
    time_t t;
    init_daemon();//初始化为Daemon

    while(1)//每隔一分钟向test.log报告运行状态
    {
        sleep(60);//睡眠一分钟
        if((fp=fopen("test.log","a")) >=0){
            t=time(0);
            fprintf(fp,"Im here at %sn",asctime(localtime(&t)) );
            fclose(fp);
        }
    }
}

以上程序在RedHat Linux6.0下编译通过。步骤如下:
编译:gcc -g -o test init.c test.c
执行:./test
查看进程:ps -ef
python入门教程:使用Python编写Linux系统守护进程实例 @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 这篇文章主要介绍了使用Python编写Linux系统守护进程实例,本文先是讲解了什么是守护进程,然后给出了一个Python语言的简单实现,需要的朋友可以参考下 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成 阅读详情

相关推荐

Linux系统编程(三)守护进程( daemon)

linux创建守护进程

qq_1033275663的博客 1646

Linux守护进程的编写

Linux守护进程的编写

weixin_71574198的博客 1893

软件破解逆向安全(一)初识内存地址和偏移

工具:CE 内存:数字->存访在电脑中->内存 实例:如何修改植物大战僵尸阳光 内存搜索最核心:过滤数据 先用CE加载植物大战僵尸,如下图 我们可以看到目前我们的阳光数是50,我们尝试在ce里搜索精确数值,4 byte是int整数的表示。 我们发现有很多数据,尝试收集一个阳光变成75再次搜索: 我们发现就一个了,这时我们可以双击Value随便修改阳光的数值了。 这里我们说一下动态和静态地址 动态地址:临时用于存放数据的地址,黑色。特征:重新启动游戏地..

weixin_43781139的博客 2590

Linux实现守护进程创建

当用户执行了一个程序时,就相当于创建了一个进程组,跟该进程具有亲缘关系的所有进程都属于该进程组。当用户打开一个终端时,就创建了一个会话,一个会话由一个或者多个进程组组成,一旦终端关闭,该会话中所有进程组中的进程全部结束。......

m0_45901455的博客 2857

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6558

Ruoyi-Cloud集成Seata2.0实现分布式事务

在网络上,关于Spring Cloud和Ruoyi-Cloud整合Seata的教程有很多,针对不同版本的 Seata 也有不少相关教程。事实上,无论是 Spring Cloud 还是 Ruoyi-Cloud,其整合 Seata 的原理基本相同。这篇博文将详细介绍如何在本地开发环境下,在中实现Seata 2.0的整合,希望能为大家在分布式项目中实现 Seata 的整合提供实用的帮助,提供一个清晰的操作思路。

SR003的博客 2245

Linux应用编程——简单守护进程的编写

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。当关闭终端时,相应的进程都会被关闭,而守护进程却能够突破这种限制,脱离终端。守护进程脱离终端是为了避免在执行过程中的信息在任何终端上显示,并且不被任何终端产生的终端信息所打断任何一个进程都可以将自己实现成守护进程。

weixin_56546908的博客 1674

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7842

Linux系统下使用shell脚本编写守护进程

linux系统下通过shell脚本实现守护进程

Immorr的博客 7837

TMC5160 StallGuard2调参避坑指南:从SG_RESULT飘忽不定到稳定检测堵转

本文详细解析了TMC5160的StallGuard2功能在堵转测试中的调参技巧,从SG_RESULT波动问题到稳定检测的完整解决方案。通过电流环与反电动势分析、电源噪声处理及低速校准法等实用方法,帮助工程师实现工业级可靠的堵转检测,避免误触发和检测失效问题。

weixin_28727975的博客 378

华为OD机试双机位C卷-统计差异值大于相似值二元组个数(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【统计差异值大于相似值二元组个数】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 统计差异值大于相似值二元组个数

qq_45776114的博客 783

linux守护进程以及如何编写守护进程程序

linux守护进程以及如何编写守护进程程序

jinking01的专栏 1029

极智AI | 谈谈为什么卷积加速更喜欢 NHWC Layout

本文主要讨论一下为什么卷积加速更加喜欢 NHWC 的数据排布。

极智视界 2970

linux守护进程的编写

Linux守护进程 了解守护进程的特点 了解ps中查看守护进程的方法 了解会话相关概念 掌握编写守护进程的方法 一、基础知识 1)进程的类型,进程大体分为三类        (1)交互进程        (2)批处理进程        (3)守护进程 2)守护进程的特点       (1)运行方式: 守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。周期...

YH3608的博客 2761

中国国家级地面气象站基本气象要素日值数据集(V3.0)

气温数据TEM, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气温(tmean), 最高气温(tmax), 最低气温(tmin)气压数据PRS, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气压(pmean), 最高气压(pmax), 最低气压(pmin)中国国家级地面气象站基本气象要素日值数据集(V3.0)

J_Giser的博客 3891

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

linux下守护进程编写,Linux下后台守护进程的编写实例

Linux下后台守护进程的编写实例tongxin | 2009-04-12 16:58:07 阅读:2357 发布文章相信随着Linux的普及,大家都在写不少Linux下的程序了,尤其是一些服务端程序慢慢地都转到Linux下了吧。大家必然碰到问题是如何让自己的进程成为守护进程,在系统启动的时候运行,并且永远是后台进程。下面就写一个这样的程序了。源代码如下:%A //////...

weixin_42509196的博客 169

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Linux中编写简单的守护进程

1、守护进程概述 守护进程就是通常所说的daemon进程,他是linux中的后台服务进程。他是一个生存期很长的进程,通常独立于控制终端并且周期性的执行某种任务,或等待处理魔种发生的事件。守护进程通常在系统开机启动时开始执行,在系统关闭时终止。linux中很多服务器都是通过守护进程实现的。 由于在linux中,每一个系统与用户进行交流的界面成称为终端。每一个从终端开始执行的进程都会依赖于终端,这...

David_361的博客 2737

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux上编写守护进程的例程

linux上编写守护进程的例程  摘自《开放系统世界》2004年第5期郭吉平、任莲的文章“亲自动手编写守护进程”。 /*郭吉平、任莲 亲自动手编写守护进程*/#include #include #include void main(int argc, char ** argv){time_t now;int childpid, fd, fdtablesize;int error, in,

最实用的Linux博客 2809

linux守护进程写法_Linux守护进程编写方法及原理

什么守护进程?守护进程是运行在后台的一种用来提供服务的进程,他脱离控制台独立运行,守护进程是一种很有用的进 程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。守护进程的特征?1、后台运行守护进程最重要的特性是后台运行。脱离控制台,但我们关闭控制台是不能关闭守护进程的,可以使用kill -9 守护进程的PID来强行关闭守护进程。2、独...

weixin_39918747的博客 173

Linux下后台守护进程的编写实例

转载:http://zhoulifa.bokee.com/4627106.html Linux下后台守护进程的编写实例 关键词: Linux    守护    后台    daemon    进程  相信随着Linux的普及,大家都在写不少Linux下的程序了,尤其是一些服务端程序慢慢地都转到Linux下了吧。大家必然碰到问题是如何让自己的进程成为守护进程,在系统启动的时候

pingnanlee的专栏 1566

linux-守护进程的编写

linux编程-守护进程编写守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待 处理某些发生的事件。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。 同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。   守护进程的编程本身并不

L未若的博客 560

Linux实验:多进程、守护进程的编写

1、实验内容与目的 (1)通过编写多进程程序,使读者熟练掌握 fork()、exec()、wait()和 waitpid()等函数的使用,进一步理解在 Linux中多进程编程的步骤。 (2)通过编写一个完整的守护进程,使读者掌握守护进程编写和调试的方法,并且进一步熟悉如何编写多进程 程序。 2、基本原理与方法(原理、流程图) (1)multi_proc_wrong.c程序同时创建两个子进程,两个进...

Lychee的博客 2586

用Python给Linux编写守护进程

守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。通常,守护进程没有任何存在的父进程(即PPID=1),且在UNIX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。–维基百科

tycoon的专栏 695
上一篇: iOS中使用blend改变图片颜色
下一篇: linux下crontab的使用方法
lifreshman
博客等级 码龄17年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值