守护进程

xiaoxiao2021-02-28  40

细心的朋友可能注意到,我的上一篇博客“crond和crontab分别是什么”中提到过一个关键词——守护进程。 那么什么是守护进程呢?我们现在就来进行讨论。

守护进程:

守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd。这些系统 服 务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们⼀一直在运行着。这种进程有一个名称叫守护进程(Daemon)。

如何创建守护进程

实现方法:

#include <unistd.h> #include <signal.h> #include <fcntl.h> #include <sys/syslog.h> #include <sys/param.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <time.h> int init_daemon(void) { int pid; int i; // 1)屏蔽一些控制终端操作的信号 signal(SIGTTOU,SIG_IGN); signal(SIGTTIN,SIG_IGN); signal(SIGTSTP,SIG_IGN); signal(SIGHUP ,SIG_IGN); // 2)在后台运行 if( pid=fork() ){ // 父进程 exit(0); //结束父进程,子进程继续 }else if(pid< 0){ // 出错 perror("fork"); exit(EXIT_FAILURE); } // 3)脱离控制终端、登录会话和进程组 setsid(); // 4)禁止进程重新打开控制终端 if( pid=fork() ){ // 父进程 exit(0); // 结束第一子进程,第二子进程继续(第二子进程不再是会话组长) }else if(pid< 0){ // 出错 perror("fork"); exit(EXIT_FAILURE); } // 5)关闭打开的文件描述符 // NOFILE 为 <sys/param.h> 的宏定义 // NOFILE 为文件描述符最大个数,不同系统有不同限制 for(i=0; i< NOFILE; ++i){ close(i); } // 6)改变当前工作目录 chdir("/tmp"); // 7)重设文件创建掩模 umask(0); // 8)处理 SIGCHLD 信号 signal(SIGCHLD,SIG_IGN); return 0; } int main(int argc, char *argv[]) { init_daemon(); while(1); return 0; }

为什么创建守护进程时有人fork两次?

(1)调用一次fork的作用: 第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之后,子进程是会话组长也是进程组组长,并且脱离了控制终端,此时,不管控制终端如何操作,新的进程都不会收到一些信号使得进程退出。 (2)第二次fork的作用: 虽然当前关闭了和终端的联系,但是后期可能会误操作打开了终端。 只有会话首进程能打开终端设备,也就是再fork一次,再把父进程退出,再次fork的子进程作为守护进程继续运行,保证了该精灵进程不是对话期的首进程,

分类:

按照服务类型分为如下几个。 1.系统守护进程:syslogd、login、crond、at等。 2.网络守护进程:sendmail、httpd、xinetd、等。 3.独立启动的守护进程:httpd、named、xinetd等。 4.被动守护进程(由xinetd启动):telnet、finger、ktalk等

转载请注明原文地址: https://www.6miu.com/read-79643.html

最新回复(0)