(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) 锁的状态不会被子程序继承。如果程序关闭则锁失效而不管子程序是否在执行。 (Locks are associated with processes. A process can only have one kind of lock set for each byte of a given file. When any file descriptor for that file is closed by the process, all of the locks that process holds on that file are released, even if the locks were made using other descriptors that remain open. Likewise, locks are released when a process exits, and are not inherited by child processes created using fork.) (5) 参考资料: fcntl(档案锁) 表标头档案 #include #include 函式定义 int fcntl(int fd, int cmd, struct flock *lock); 函式解释 fd: 档案描写符 设定的档案描写符,引数 cmd 代表欲垄断的号召 F_DUPFD 复制引数 fd 的档案描写符,厉行获胜则归来新复制的档案描写符, F_GETFD 获得 close-on-exec 符号,若些符号的 FD_CLOEXEC 位为 0,代表在呼叫 exec() 相干函式时档案将不会关闭 F_SETFD 设定 close-on-exec 符号,该符号以引数 arg 的 FD_CLOEXEC 位定夺 F_GETFL 获得 open() 设定的符号 F_SETFL 改换 open() 设定的符号 F_GETLK 获得档案锁定的事态,依据 lock 的描写,定夺是否上档案锁 F_SETLK 设定档案锁定的事态,此刻 flcok,构造的 l_tpye 值定然是 F_RDLCK 、 F_WRLCK 或 F_UNLCK, 万一无法发生锁定,则归来-1 F_SETLKW 是 F_SETLK 的阻塞版本,在无法获得锁时会进去睡眠事态,万一能够获得锁可能捉拿到讯号则归来 引数 lock 指标为 flock 构造指标定义如下 struct flock { … short l_typejngaoy.com; short l_whence; off_t l_start; 锁定区域的开关位置 off_t l_len; 锁定区域的大小 pid_t l_pid; 锁定动作的历程 … }; 1_type 有三种事态: F_RDLCK 读取锁(分享锁) F_WRLCK 写入锁(排斥锁) F_UNLCK 解锁 l_whence 也有三种措施 SEEK_SET 以档案开始为锁定的起始位置 SEEK_CUR 以现在档案读写位置为锁定的起始位置 SEEK_END 以档案尾为锁定的起始位置 归来值 获胜则归来 0,若有讹谬则归来-1 l_len: 加锁区的长度 l_pid: 具有阻塞目前历程的锁,其持有历程的历程号储藏在 l_pid 中,由 F_GETLK 归来 等闲是将 l_start 设定为 0,l_whence 设定为 SEEK_SET,l_len 设定为 0