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\n", 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\n", getpid());
    res = fcntl(file_desc, F_SETLK, &region_1);
    if (res == -1){
     fprintf(stderr, "Failed to lock region 1\n");
   } res
= fcntl(file_desc, F_SETLK, &region_2); if (res == -1){
     fprintf(stderr, "Failed to lock region 2\n");
   }      
//睡眠60秒,然后关闭文件 sleep(60); printf("Process %d closing file\n", getpid()); close(file_desc); exit(EXIT_SUCCESS); }

结果如下:

posted @ 2013-12-24 21:23  LOSER Z  阅读(565)  评论(0编辑  收藏  举报