在 Linux 系统的目录/var/run 下面一般我们都会看到很多的*.pid 档案。而且往往新安装的程式在执行后也会在/var/run 目录下面产生自己的 pid 档案。那么这些 pid 档案有什么作用呢?它的内容又是什么呢?
(1) pid 档案的内容:pid 档案为文字档案,内容只有一行, 记录了该程序的 ID。
用 cat 命令可以看到。
(2) pid 档案的作用:防止程序启动多个副本。只有获得 pid 档案 (固定路径固定档名) 写入许可权 (F_WRLCK) 的程序才能正常启动并把自身的 PID 写入该档案中。其它同一个程式的多余程序则自动退出。
(3) 程式设计技巧:
呼叫 fcntl 设定 pid 档案的锁定 F_SETLK 状态,其中锁定的标志位 F_WRLCK。
如果成功锁定,则写入程序当前 PID,程序继续往下执行。
如果锁定不成功,说明已经有同样的程序在执行了,当前程序结束退出。
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
if (fcntl(fd, F_SETLK, &lock) < 0){
//锁定不成功, 退出……
}
sprintf (buf, “%dn”, (int) pid);
pidsize = strlen(buf);
if ((tmp = write (fd, buf, pidsize)) != (int)pidsize){
//写入不成功, 退出……
}
(4) 一些注意事项:
i) 如果程序退出,则该程序加的锁自动失效。
ii) 如果程序关闭了该档案描述符 fd, 则加的锁失效。(整个程序执行期间不能关闭此档案描述符)
iii) 锁的状态不会被子程序继承。如果程序关闭则锁失效而不管子程序是否在执行。