• Linux网络编程学习(四) -----守护进程的建立(第三章)


    本文介绍一个例程daemon_init()

    #include <sys/types.h>
    #include <signal.h>
    #include <unistd.h>
    #include <syslog.h>
    #define MAXFD 64
    void daemon_init(const char *pname, int facility)
    {
    	int i:
    	pid_t pid;
    	/* fork,终止父进程 */
    	if (pid = fork())
    		exit(0);
    	/* 第一子进程 */
    	setsid();
    	signal(SIGHUP,SIG_IGN);
    	/* fork,终止第一子进程 */
    	if (pid = fork())
    		exit(0);
    	/* 第二子进程 */
    	daemon_proc = 1;
    	/* 将工作目录设定为"/" */
    	chdir("/");
    	/* 清除文件掩码 */
    	umask(0);
    	/* 关闭所有文件句柄 */
    	for (i = 0;i < MAXFD;i++)
    	{
    		close(i);
    	}
    	/* 打开log */
    	openlog(pname,LOG_PID,facility);
    }
    

      守护进程建立的主要过程

    1、fork

    通过fork出一个子进程,并把父进程关闭,这样子进程就成了后台进程,而且子进程从父进程那里继承了组标识符同时又拥有了自己的进程标识符,这样就保证了子进程不会是一个进程组的首进程

    2、setsid

    setsid()创建了一个新的进程组,调用进程成为了这个进程组的首进程,这样就使得该进程脱离了原来的终端,成为了独立于终端外的进程

    3、忽略SIGHUP信号,重新fork

    这样使进程不再是进程组的首进程,可以放置在某些情况下的打开终端而重新与终端发生联系

    4、改变工作目录,清除文件掩码

    改变目录是为了切断进程与原有文件系统的联系,并且保证无论从什么地方启动进程都能正常工作,清除文件掩码是为了消除进程自身对其创建文件的影响

    5、关闭全部已经打开的文件jubing

    防止子进程继承了父进程中打开的文件而使这些文件始终保持打开状态从而产生某些冲突

    6、打开log系统

    个人对这个例子的理解就是,首先该进程是一个父进程,拥有进程组标识符和进程标识符,然后通过fork创建一个子进程(第一子进程),终止父进程,但是呢,子进程虽然拥有自己的进程标识符,但却继承了父进程的进程组(进程组一)标识符,所以,该进程组是原先就存在的,那么这个第一子进程就不是该进程组的首进程了。然后呢,通过setsid创建了一个新的进程组(进程组二),因为是新创建的,所以必然是首进程咯,那么这个首进程就脱离了原先的进程环境,独立于终端外了,然后呢,在这个新的进程组(进程组二)又重新fork出一个子进程(第二子进程),对于第二子进程来说,第一子进程就是其父进程,所以将父进程终止就是将第一子进程终止,此时,第二子进程已经独立于原来的终端外了,并且该第二子进程也不是所属进程组(进程组二)的首进程,最后改变工作目录,清掩码,关闭文件句柄,打开Log系统,那么这个第二子进程就是创建的守护进程,嗯,我是这么理解的,不知道理解对不对?请大神指出!

  • 相关阅读:
    定律法则
    thymeleaf模板引擎基础使用(转)
    OGNL是什么
    ZooKeeper可视化Web管理工具收集(待实践)
    Java下用Jackson进行JSON序列化和反序列化(转)
    JQuery获取select选中值和清除选中状态(转)
    Javascript控制回车键进行表单(form)提交(转)
    Javascript中数据与字符串互转(转)
    MySQL的limit用法及优化(转)
    Javascript中JSON的序列化和反序列化(转)
  • 原文地址:https://www.cnblogs.com/xqn2017/p/8890909.html
Copyright © 2020-2023  润新知