main>PostmasterMain->CreateDataDirLockFile->CreateLockFile
::
for (ntries = 0;; ntries++){
// O_EXCL
若存在则返回失败,
errno
是
17
fd = open('lename, O_RDWR | O_CREAT | O_EXCL,
pg_'le_create_mode);
if (fd >= 0)
break;
if ((errno != EEXIST && errno != EACCES) || ntries > 100)//
重试
100
次
could not create lock 'le
fd = open('lename, O_RDONLY, pg_'le_create_mode);
...
if ((len = read(fd, bu8er, sizeof(bu8er) - 1)) < 0)
...
close(fd);
//0
表示检查进程是否存在。
ESRCH
:没有这个进程;
EPERM
:操作不允许
if (kill(other_pid, 0) == 0 ||(errno != ESRCH && errno != EPERM)){
lock 'le \"%s\" already exists
}
if (unlink('lename) < 0)//
删除,然后循环再试创建
...
}
//
此时创建成功
if (write(fd, bu8er, strlen(bu8er)) != strlen(bu8er))//
写入
pid
内容
...
if (pg_fsync(fd) != 0)
...
if (close(fd) != 0)
...
介绍启动时
pid
文件即锁文件的处理,若异常宕机,导致
pid
文件残留,那么重启时会自
动将这个文件删除吗?
1
)会以
O_RDWR | O_CREAT | O_EXCL
形式
open
,若存在的话会返回创建文件失
败。
2
)若创建失败则会重试
100
次
3
)若文件已存在,则以只读的形式再次
open
并读取文件内容
4
)解析出
pid
,并通过
kill(pid,0)
判断进程是否存在(注意,若有子进程残留也会判
断出来)
5
)若有进程不存在,则将这个文件删除,然后进行重试
6
)创建成功后,将当前进程信息写入文件并
sync
持久化。
7
)最后将文件句柄关闭
评论