标签:守护进程
守护进程也称精灵进程( 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