linux pid文件

在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();
posted @ 2015-09-14 11:43  thomas_blog  阅读(188)  评论(0编辑  收藏  举报