码迷,mamicode.com
首页 > 系统相关 > 详细

守护进程

时间:2016-05-08 20:05:48      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:守护进程

守护进程也称精灵进程( Daemon),是运行在后台的一种特殊进程。它独立于控制终端并
且周期性地执行某种任务或等待处理某些发生的事件。

Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着。这种进程有一个名称叫守护进程(Daemon)。例如:udevd负责维/dev目录下的设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件,可以看守护进程通常采用以d结尾的名字,表示Daemon

精灵进程特点:自成进程组,自成会话,和终端无关(无数据交流),即tty为?。不能进行前后台控制,因为前后台是相对于终端来说,会话由前台进程和后台进程组成,而精灵进程自成会话。

精灵进程作用:提供服务。eg:内核线程:完成操作系统级别服务.

注销时:kill当前所有进程,精灵进程不受影响。

创建守护进程方法:

#include <unistd.h>

pid_t setsid(void);

注:调用这个函数之前,当前进程不允许是进程组的Leader,否则该函数返回-1。要保证当前进程不是进 程组的Leader也很容易,只要先fork再调用setsid就行了。 fork创建的父进程和子进程在同一个进程组中,进程组的Leader必然是该组的第一个进程,所以子进程不可能是该组的第一个进程,在子进程中调用setsid就不会有问题了。

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

创建守护进程
1. 调用umask将文件模式创建屏蔽字设置为0.
2. 调用fork,父进程退出( exit。原因: 1)如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止使得shell认为该命令已经执行完毕。 2)保证子进程不是一个进程组的组长进程。
3. 调用setsid创建一个新会话。
4. 将当前工作目录更改为根目录。

#include <unistd.h>

int chdir(const char *path);

On  success,  zero is returned.  On error, -1 is returned,

5. 关闭不在需要的文件描述符。
6. 其他:忽略SIGCHLD信号。


#include<stdio.h>                                                               
#include<signal.h>
#include<stdlib.h>
void handle(int sig)
{
    //do nothing
}
void my_daemon()
{
    umask(0);
    pid_t tid=fork();//fork前单进程,父进程是进程组组长,fork后单进程,子进程不是进程组组长
    if(tid<0){
        ftok("fork");
        exit(1);
    }
    else if(tid>0){//father
        exit(0);
    }
    setsid();
     if(chdir("/")<0){
            printf("change dir error\n");
            return;
        }     
    close(0);
    close(1);
    close(2);
    signal(SIGCHLD,handle); 
}
int main()
{
    my_daemon();//精灵化
    while(1);
    return 0;
}

技术分享

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1771202

守护进程

标签:守护进程

原文地址:http://10541556.blog.51cto.com/10531556/1771202

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!