系统相关
首页 > 系统相关> > PG守护进程(Postmaster)——InitPostmasterDeathWatchHandle

PG守护进程(Postmaster)——InitPostmasterDeathWatchHandle

作者:互联网

InitPostmasterDeathWatchHandle函数初始化仅仅一个句柄用于监控postmaster death。在postmaster中调用,这样子进程在父进程挂掉之后才能监控到(subsequently monitor)。创建postmaster_alive_fds管道,postmaster拥有管道的写端,子进程拥有管道的读端。子进程可以将读端的文件描述符传递到select中在postmaster die后唤醒,或者通过read函数返回0来检查postmaster death。子进程必须在forking之后立刻关闭该管道的写端(只有在所有子进程关闭了写端之后,EOF在read端才会有信号,EOF won’t be signaled in the read end until all processes have closed the write fd)

static void InitPostmasterDeathWatchHandle(void){
	/* Create a pipe. Postmaster holds the write end of the pipe open
	 * (POSTMASTER_FD_OWN), and children hold the read end. Children can pass
	 * the read file descriptor to select() to wake up in case postmaster
	 * dies, or check for postmaster death with a (read() == 0). Children must
	 * close the write end as soon as possible after forking, because EOF
	 * won't be signaled in the read end until all processes have closed the
	 * write fd. That is taken care of in ClosePostmasterPorts(). */
	Assert(MyProcPid == PostmasterPid);
	if (pipe(postmaster_alive_fds) < 0)
		ereport(FATAL,
				(errcode_for_file_access(),
				 errmsg_internal("could not create pipe to monitor postmaster death: %m")));

	/*
	 * Set O_NONBLOCK to allow testing for the fd's presence with a read()
	 * call.
	 */
	if (fcntl(postmaster_alive_fds[POSTMASTER_FD_WATCH], F_SETFL, O_NONBLOCK) == -1)
		ereport(FATAL,
				(errcode_for_socket_access(),
				 errmsg_internal("could not set postmaster death monitoring pipe to nonblocking mode: %m")));

标签:InitPostmasterDeathWatchHandle,postmaster,death,end,read,Postmaster,pipe,write,P
来源: https://blog.csdn.net/asmartkiller/article/details/122010867