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

Posted xqn2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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系统,那么这个第二子进程就是创建的守护进程,嗯,我是这么理解的,不知道理解对不对?请大神指出!

以上是关于Linux网络编程学习 -----守护进程的建立(第三章)的主要内容,如果未能解决你的问题,请参考以下文章

Linux应用学习_网络开发

有关于《Linux C编程一站式学习》(备份)

linux学习4 网络命令和关机重启

linux基础网络工具学习笔记

linux--docker学习笔记

Linux学习之网络基本知识拓展学习