守护进程

守护进程:
守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond等。
守护进程的特点:
(1)、Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。
(2)、其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。
(3)、一般是孤儿进程
(4)、其父进程是一号进程,通常以d结尾
(5)、在后台运行,独立于终端,周期性的以某种任务或等待处理某些发生的事(生命周期为7*24小时)
守护进程存在的原因
daemon函数存在的原因是因为控制终端由于某些原因(如断开终端链接)会发送一些信号的原因。而接收进程处理这些信号缺省动作会让进程退出。这些信号会由于终端上敲一些特殊按键而产生。

守护进程的创建过程

(1)、首先要设置文件创建屏蔽字umask(0)

原因:因为守护进程可能创建文件,而不修改则在创建文件的时候和目标文件的权限不同。

(2)、在父进程中fork出子进程(也就是我们目的的守护进程),然后让父进程退出

原因:如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。保证子进程不是一个进程组的组长进程。

(3)、chdir修改当前工作目录

原因:守护进程有可能访问根目录下的文件,如果没有修改必须先到达根目录,而且如果没有修改则守护进程创建的文件在当前目录下,如果当前目录被删除则找不到守护进程所创建的根目录,而创建在根目录下则永远不会被删除。

(4)、关闭不需要的文件描述符

原因:我们的守护进程是用用父进程fork出来的,而守护进程在不必需要某些父进程的文件描述符。

(5)、忽略SIGCHLD信号

原因:子进程退出不给父进程发送信号。

创建守护进程的函数:

#include <unistd.h>
pid_t setsid(void);
该函数调用成功时返回新创建的Session的id(其实也就是当前进程的id),出错返回-1。注意,调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进程组的Leader也很容易,只要先fork再调用setsid就⾏行了。fork创建的⼦子进程和父进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子 进程中调用setsid就不会有问题了。

成功调用该函数的结果是:
1. 创建一个新的Session,当前进程成为Session Leader,当前进程的id就是Session的id。
2. 创建一个新的进程组,当前进程成为进程组的Leader,当前进程的id就是进程组的id。
3. 如果当前进程原本有一个控制终端,则它失去这个控制终端,成为一个没有控制终端的进程。所谓失去控制终端是指,原来的控制终端仍然是打开的,仍然可以读写,但只是一个普通的打开⽂文件而不是控制终端了。



在上图中我们可以看出守护进程的父进程id为1,自成进程组,自成回话,且与中断控制没有关系。

查看守护进程的详细信息:


从上图中可以看出我创建出来的守护进程的id为2547,我们可以cd /proc/2547。

在上图中我们看到cwp-> / ,cwd就是显示当前工作目录,而cwp-> /就是当前工作目录为根目录,下面还有一个exe

它后面显示的是守护进程所在的目录,


我们可以看到当我们cd fd 时下面什么都没出现,因为我们已经关闭了守护进程的3个文件描述符所以什么都不显示

下面我们测试一下,关闭一个文件描述符和不更改工作目录

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

void mydaemon()
{
    umask(0);
    pid_t id = fork();
    if(id > 0)
        exit(0);
    setsid();
    //chdir("/");
    close(0);
    //close(1);
    //close(2);
    signal(SIGCHLD, SIG_IGN);

}


int main()
{
    mydaemon();
    while(1);
    return 0;
}


从上图中我们可以看出这次创建的守护进程的id为2881他的工作目录和运行的目录是一样的,而且我们也看到了当我cd fd 中然后 ls 就显示了 1 2,因为这次close(0),也就是标准输入文件描述符,而1和2标准输出和标准错误没有关闭所以就显示了它们两个。

还有一个函数可以创建守护进程:

#include<unistd.h>
int daemon(int nochdir,int noclose);
damon参数可以从表面意思上看出为工作目录和关闭的文件描述符。

参数1和参数2他们都为0时,设置工作目录为根目录,将标准输入,输出和错误重定向到/dev/null。

/dev/null为liunx下的黑洞,这个黑洞是写不满的而且写入东西则会直接被丢弃。

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

int main()
{
     daemon(0, 0);
     while(1);
     return 0;
}



守护进程创建过程中两次fork:

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

void mydaemon()
{
    umask(0);
	if (fork() > 0)
		exit(0);
	setsid();
	signal(SIGCHLD, SIG_IGN);
    pid_t id = fork();
    if(id > 0)
        exit(0);
    chdir("/");
    close(0);
    close(1);
    close(2);
}


int main()
{
    mydaemon();
    while(1);
    return 0;
}


从上图可以看出这一次创建的守护进程的pid != sid

1 、第一次fork的作用是让shell 认为本条命令 已经终止,不用挂在终端输入上。还有一个作用是为后面setsid服务。setsid的调用者不能是进程组组长(group leader). 此时父进程是进程组组长。
2 、setsid() 是本函数最重要的一个调用。它完成了daemon函数想要做的大部分事情。调用完整个函数。子进程是会话组长(sid==pid),也是进程组组长(pgid == pid),并且脱离了原来控制终端。到了这一步,基本上不管控制终端如何怎么样。新的进程都不会收到那些信号。
3  、经过前面2个步骤,基本想要做的都做了。第2次fork不是必须的。也看到很多开源服务没有fork第二次。fork第二次主要目的是。防止进程再次打开一个控制终端。因为打开一个控制终端的前台条件是该进程必须是会话组长。再fork一次,子进程ID != sid(sid是进程父进程的sid)。所以也无法打开新的控制终端。


每天,有近900万存在于互联网中的站点受到安全攻击(数据来源:Rising.com.cn),其中绝大多数网站租用虚拟主机搭建, 无权在服务器端安装专用防护软件以及进行必要的安全配置,即使站点采用独立服务器运行,目前市面上大多数杀毒软件针对恶意 脚本的查杀力度远远不够,主要针对于服务器的安全防护方面,稍微进行一些代码变形即可轻松绕过查杀。     Guardian Genius(守护精灵)由此应运而生,该程序与网站程序同样使用脚本代码编写,基于脚本语言ASP、PHP开发的能够运 行在 Windows IIS 6/7/7.5 ASP/PHP下(Linux Apache2 PHP5 的支持将视情况尽快开发完毕),无须在服务器端安装任何应用程序 。也就是说,只要您的服务器能够运行网站程序就能运行本程序。     本程序的诸多业内首创特性和特殊的针对性使之全面超越当前网络上各种安全防护产品的能力和性能。     多脚本支持:程序自带ASP/PHP双重脚本语言支持功能,运行时自动检测网站所支持的脚本类型,并且自动启用,无须用户选择 ASP/PHP版本单独下载,如若服务器同时支持ASP/PHP两种语言,程序将在登录界面提供ASP/PHP的选择,以此方便切换;同时无论切 换何种语言,均使用同一数据库。     主动防御:此功能作为本软件的重点功能被提到开发的最前沿位置!在前述各项功能在非即时状态保障网站程序不受到木马后 门等恶意代码程序威胁的同时,此主动防御功能将在您网站运行的同时时时保障您的站点安全。主动防御技术采用正则表达式进行 最精确的匹配,寻找用户提交信息中包含的各项威胁,并且由于是采用正则表达式逻辑匹配方式,因此误报几率几乎为零,匹配准 确度高达99%。截止本功能从09年3月开发完毕至今为其8个月时间,该功能核心代码经过三次修改完善,已经可以确保可以对当前国 内外任何一款公开版内部版网站漏洞扫描程序进行有效拦截,针对手工方式注入和注入代码变形绕过IDS等方式也有非常高的拦截率 ;与此同时对于程序正常使用中的各种数据提交不会产生误报,这是与当前网络上所有商业版及免费版SQL注入拦截代码(程序)最 大的不同之处。在执行效率上,测试发现对一般页面提交数据的检测只需要0.05-0.1秒左右,可以忽略不计。     变型不可绕过:我们知道,有一些正常的网站程序中一些关键代码会被杀毒软件误报,网站程序开发商的处理办法仅仅是稍微 对关键代码进行一些变形即可轻松让杀毒软件“哑口无言”,同样,木马程序经过稍微的变形也一样可以让杀毒软件“哑口无言” 。本程序利用正则表达式对代码中的关键代码变形进行特殊检测,任你怎么变形,照样可以检测出威胁,绝不“哑口无言”。仅此 一项,本程序已彰显在脚本安全领域完全超越其他杀毒软件。     扫描方式:程序可以根据用户设置针对当前网站脚本代码进行索引,然后对索引文件进行扫描,扫描过程中将与自身的木马后 门程序特征库进行比对,程序自身的特征库可随时连接中心服务器进行升级同步,以确保能够及时防御网络上最新的攻击;同时附 带的智能扫描功能不依靠特征库而采用正则泛匹配方式寻找可疑代码和其中存在的威胁。在进行大批量扫描时,大约每秒可扫描一 个文件,任意多个文件均可逐个扫描,扫描过程中可暂停扫描,随时可恢复。     队列机制:因为脚本语言的特殊性,无法做到类似应用程序(.exe程序)一样在对大量文件扫描时逐个扫描并且反馈扫描结果 ,因此目前网络任何一款Web安全扫描程序都存在对大量文件进行扫描时极度占用服务器资源,并且容易在执行过程中导致IIS进程 假死从而影响网站运行。针对此现象,本程序首创缓冲扫描机制,利用Ajax技术对文件进行队列扫描,扫描过程将逐个文件的进行 ,并且每个文件扫描完成立刻反馈扫描结果,同时在进度条上直观显示扫描进度和当前状态。经过实际测试,程序在执行扫描过程 中对于一台Inter Core 双核 2.2Ghz CPU 4G 内存的服务器所造成的CPU压力稳定在1%左右,内存占用忽略不计。     在线更新:这种只能在常规安全产品上出现的功能也首次被本程序提到Web程序层面上来;对于安全防护产品,时时更新同步网 络上的最新漏洞信息才是关键所在,一款不更新的防护产品在安全领域这个攻与防的此消彼长的战斗中将被直接淘汰,本程序的在 线更新功能将自动连接中心服务器进行最新特征库的下载更新,以确保时时让您的网站处于最新的防护当中。     数据库文件检索:由于主动防御功能的特殊性,需要对网站原有数据库连接文件进行修改,这对于一般的网站站长多有不便, 因此特开发数据库文件检索功能,当您不确定数据库文件位置时,你可以任意填写一个跟数据库有联系的脚本文件位置,程序将自 动“顺藤摸瓜”找到数据库连接文件的准确位置,并且自动修改数据库连接文件进行主动防御核心引擎的挂接工作,一些都无需用 户干预。     在线支持:由于多年处于IT业产品开发维护的最前沿,深知用户使用反馈的珍贵,以及用户的遇到问题是迫切需要解决时的焦 急心情,特此开发在线支持功能,您无需登录网站、论坛、发送电子邮件等,即可将您的反馈信息在本程序中通过“支持中心”立 刻发送到官方站点支持中心等待解决。     守护精灵程序官方网站:http://www.guardiangenius.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值