zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    2017蓝桥杯最大公共子串(C++B组)
    C++ memset函数用法
    2017蓝桥杯取位数(C++B组)
    2017蓝桥杯承压计算(C++ B组)
    安卓动画(Animation使用)
    2017蓝桥杯等差素数(C++B组)
    JSON取值前判断
    jstl
    centos到底下载哪个版本?
    HTML页面定时跳转方法
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709901.html
Copyright © 2011-2022 走看看