在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();