linux pid文件

来源:互联网 发布:哪家运营商4g网络最好 编辑:程序博客网 时间:2024/06/11 20:20

在Linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件

作用
防止进程启动多个副本
有写入权限(F_WRLCK)的进程才能正常启动并把自身的PID写入该文件中

fcntl

int fcntl(int fd, int cmd, ... /* arg */ );int fcntl(int fd, int cmd, struct flock *lock);

F_GETLK 取得文件锁定的状态
F_SETLK 设置文件锁定的状态。此时flcok 结构的l_type 值必须是F_RDLCK、F_WRLCK或F_UNLCK
F_SETLKW F_SETLK 作用相同,但是无法建立锁定时,此调用会一直等到锁定动作成功为止

struct flock {    ...    short l_type;    /* Type of lock: F_RDLCK,                     F_WRLCK, F_UNLCK */    short l_whence;  /* How to interpret l_start:                     SEEK_SET, SEEK_CUR, SEEK_END */    off_t l_start;   /* Starting offset for lock */    off_t l_len;     /* Number of bytes to lock */    pid_t l_pid;     /* PID of process blocking our lock                     (F_GETLK only) */    ...};

l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定
F_WRLCK 建立一个供写入用的锁定
F_UNLCK 删除之前建立的锁定

l_whence 也有三种方式:
SEEK_SET 以文件开头为锁定的起始位置
SEEK_CUR 以目前文件读写位置为锁定的起始位置
SEEK_END 以文件结尾为锁定的起始位置

l_start 表示相对l_whence位置的偏移量,两者一起确定锁定区域的开始位置

l_len表示锁定区域的长度,若果为0表示从起点(由l_whence和 l_start决定的开始位置)开始直到最大可能偏移量为止

举例

int fd = open("aa", O_CREAT | O_RDWR, 0777);struct flock lock;lock.l_type = F_WRLCK;lock.l_whence = SEEK_SET;lock.l_start = 1;lock.l_len = 10; fcntl(fd, F_SETLKW, &lock);if(fork() == 0){     struct flock lock;    lock.l_type = F_WRLCK;    lock.l_whence = SEEK_SET;    lock.l_start = 1;    lock.l_len = 10;     fcntl(fd, F_SETLKW, &lock);}puts("done.");pause();
0 0