接下来分析数据集簇初期化的过程,初期化的过程很长,并且过程中有很多相似的操作,所以在初期化中就不再一一分析函数实现了,有兴趣的朋友可以去阅读以下源码。
初期化的入口为initialize_data_directory()函数,下面开始分析
一进initialize_data_directory()函数,首先进行对信号量的处理,对于信息量的类型这里就不阐述了,可以通过百度查询
void
setup_signals(void)
{
/* some of these are not valid on Windows */
#ifdef SIGHUP//正常终了情况可能会发送该信号
pqsignal(SIGHUP, trapsig);
#endif
#ifdef SIGINT//ctrl+c信号可能会发送该信号
pqsignal(SIGINT, trapsig);
#endif
……
}
接下来创建pgdata目录
void
create_data_directory(void)
{
int ret;
switch ((ret = pg_check_dir(pg_data)))
{
case 0:
/* PGDATA not there, must create it */
printf(_("creating directory %s ... "),
……
case 1:
……
if (chmod(pg_data, S_IRWXU) != 0)
{
fprintf(stderr, _("%s: could not change permissions of directory \"%s\": %s\n"),
progname, pg_data, strerror(errno));
exit_nicely();
}
……
//这里会判断目录是否有权限,或者目录是否为空等情况
}
}
接下来创建pgdata目录下xlog目录,其中主要也是判断权限,路径等问题,就不展开函数了
create_xlog_or_symlink();
接下来创建pgdata下的其他子目录
for (i = 0; i < lengthof(subdirs); i++)
{
//subdir这个列表在前期准备篇中提到过,里面存放需要创建的子目录的名称
char *path;
path =