zoukankan      html  css  js  c++  java
  • Linux学习笔记14——使用fcntl实现文件锁定

    期末考试快要来了,Linux学习进度一下拉下来许多。今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf。下面主要是fcntl的调用。

      fcntl函数的原型是:int fcntl( int fd,            //文件标识符

                     int command,        //这个具体选项看学习笔记11,最后有具体介绍,这里主要用到的是F_GETLKF_SETLKF_SETLKW

                   struct flock* flock_structure  //文件锁结构体

                   );

      上面出现的第二个参数,有三种情况:

        1、F_GETLK:用来查看文件中某个区域的当前锁状态

        2、F_SETLK:对fildes指向文件的某个区域加锁或解锁

        3、F_SETLKW:和F_SETLK命令作用相同,但在无法获取锁时,这个调用将等待直到可以为止。一旦这个调用开始等待,只有在可以获取锁或收到一个信号时它才会返回。

     

      上面出现的第三个参数flock_structure是一个结构体,它的定义如下:

      struct flock
      {
        short int l_type;         //锁定的状态,如果是共享(只读)锁则取值为F_RDLCK,如果是独占(写)锁则取值为F_WRLCK
        short int l_whence;       //决定l_start位置,SEEK_SET,SEEK_CUR,SEEK_END中的一个
        off_t l_start;           //锁定区域的开头位置
        off_t l_len;            //锁定区域的大小
        pid_t l_pid;            //锁定动作的进程的标识符
      };

      好,函数的定义就介绍到这里,下面是具体的使用:

    #include <unistd.h>
    
    #include <stdlib.h>
    
    #include <stdio.h>
    
    #include <fcntl.h>
    
    const char *test_file = "/tmp/test_lock";
    
    int main() {
        int file_desc;
        int byte_count;
        char *byte_to_write = "A";
        struct flock region_1;
        struct flock region_2;
        int res; 
    
         //打开一个文件描述符
        file_desc = open(test_file, O_RDWR | O_CREAT, 0666);
        if (!file_desc) {
            fprintf(stderr, "Unable to open %s for read/write
    ", test_file);
            exit(EXIT_FAILURE);
        }
          //向file_desc文件中写入100个字母'A',且一个字母'A'占一个字节
        for(byte_count = 0; byte_count < 100; byte_count++) {
            (void)write(file_desc, byte_to_write, 1);
        }
         //把文件的10~30字节设为区域1,并在其上设置共享锁
        region_1.l_type = F_RDLCK;
        region_1.l_whence = SEEK_SET;
        region_1.l_start = 10;
        region_1.l_len = 20; 
         //把文件的40~50字节设为区域2,并在其上设置独占锁
        region_2.l_type = F_WRLCK;
        region_2.l_whence = SEEK_SET;
        region_2.l_start = 40;
        region_2.l_len = 10;
         //现在锁定文件
        printf("Process %d locking file
    ", getpid());
        res = fcntl(file_desc, F_SETLK, &region_1);
        if (res == -1){
         fprintf(stderr, "Failed to lock region 1 ");
       } res
    = fcntl(file_desc, F_SETLK, &region_2); if (res == -1){
         fprintf(stderr, "Failed to lock region 2 ");
       }      
    //睡眠60秒,然后关闭文件 sleep(60); printf("Process %d closing file ", getpid()); close(file_desc); exit(EXIT_SUCCESS); }

    结果如下:

  • 相关阅读:
    【Thinking in Java, 4e】初始化与清理
    【Thinking in Java, 4e】控制流程执行
    【Beginning Python】抽象(未完)
    【Python】装饰器 & 偏函数
    【c++ primer, 5e】函数声明 & 分离式编译
    【Python】闭包 & 匿名函数
    【c++ primer, 5e】【函数基础】
    【Python】高阶函数
    变相的取消Datagridview控件的选中状态
    NotifyICon控件使用
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3489713.html
Copyright © 2011-2022 走看看