Linux学习笔记14——使用fcntl实现文件锁定
期末考试快要来了,Linux学习进度一下拉下来许多。今天学习的是文件锁定,在Linux中,实现文件锁定的方法很多,例如fcntl和lockf。下面主要是fcntl的调用。
fcntl函数的原型是:int fcntl( int fd, //文件标识符
int command, //这个具体选项看学习笔记11,最后有具体介绍,这里主要用到的是F_GETLK、F_SETLK或F_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, );
    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 = ; byte_count < ; byte_count++) {
        (void)write(file_desc, byte_to_write, );
    }
     //把文件的10~30字节设为区域1,并在其上设置共享锁
    region_1.l_type = F_RDLCK;
    region_1.l_whence = SEEK_SET;
    region_1.l_start = ;
    region_1.l_len = ;
     //把文件的40~50字节设为区域2,并在其上设置独占锁
    region_2.l_type = F_WRLCK;
    region_2.l_whence = SEEK_SET;
    region_2.l_start = ;
    region_2.l_len = ;
     //现在锁定文件
    printf("Process %d locking file\n", getpid());
    res = fcntl(file_desc, F_SETLK, ®ion_1);
    if (res == -){
     fprintf(stderr, "Failed to lock region 1\n");
   }
    res = fcntl(file_desc, F_SETLK, ®ion_2);
    if (res == -){
      fprintf(stderr, "Failed to lock region 2\n");    
   }  
   //睡眠60秒,然后关闭文件
    sleep();
    printf("Process %d closing file\n", getpid());
    close(file_desc);
    exit(EXIT_SUCCESS);
}
结果如下:
Linux学习笔记14——使用fcntl实现文件锁定的更多相关文章
- 批处理学习笔记14 - 把所有.mp4文件全部拷贝进统一目录
		今天下载了一套视频教程,结果发现不在同一个目录下,很乱.都放在不同文件夹下. 于是写了一个批处理来解决这个问题 @echo off for /r %%i in (*mp4) do ( copy %%i ... 
- Linux学习笔记14—文件的压缩与打包
		1..gz gzip 压缩工具压缩的文件 .bz2 bzip2 压缩工具压缩的文件 .tar tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件) .tar.g ... 
- Linux学习笔记:scp远程拷贝文件
		scp是secure copy的简写,用于Linux下进行远程拷贝文件的命令,类似的有cp,不过cp仅在本机上进行拷贝不能跨服务器. 命令格式: scp [参数] [原路径] [目标路径] -q 不显 ... 
- [转]Linux学习笔记——例说makefile 头文件查找路径
		0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ... 
- Linux学习笔记——例说makefile 头文件查找路径
		0.前言 从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ... 
- Linux学习笔记:mv移动或文件重命名
		mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 语法:mv 源文件 目标文件 视mv命令中 ... 
- Linux学习笔记14-权限基础
		权限基础 权限:操作系统限制对资源访问的机制,一般分为读.写.执行.每个文件都拥有特定权限,通过所属用户及所属组来限制哪些用户.组可以对特定文件进行什么样的操作. 每个进程都是以某个用户的身份运行,进 ... 
- Linux学习笔记(一):文件操作命令
		命令 含义 cd / 切换到根目录 cd .. 上级目录 cd ./bin 到同级的bin目录中 cd bin 到同级的bin目录中 cd - usr文件夹 cd ~ 回到root用户的主文件夹 pw ... 
- python 3.x 学习笔记14 (socket_ssh and socket_文件传输)
		ssh服务端 import socket,os server = socket.socket() server.bind(('localhost',6666)) server.listen() con ... 
随机推荐
- asp.net各种获取客户端ip方法
			Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真 ... 
- POJ 3280 Cheapest Palindrome(DP 回文变形)
			题目链接:http://poj.org/problem?id=3280 题目大意:给定一个字符串,可以删除增加,每个操作都有代价,求出将字符串转换成回文串的最小代价 Sample Input 3 4 ... 
- android入门到熟练(二)----活动
			1.活动创建对于每一个后端java类(继承至Activity或者ActionBarActivity)代码都有一个方法需要被重写[onCreate], 在此方法中可以加载界面资源文件或者绑定元素事件. ... 
- HTML5 程序设计笔记(一)
			HTML5 概述 1.html5 发展史 1993年html首次以因特网草案形式发布. 20世纪90年代,html大幅发展,从2.0版,到3.2版和4.0版.最后到1999年的4.01版. 伴随htm ... 
- Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件
			一.安装,从官网上下载安装,安装基本一直点击下一步就行.注意:node.js基于Python的,安装node.js之前电脑上要安装Python,最好是Python2.7或2.6. 二.cmd进入命令行 ... 
- php读取excel,以及php打包文件夹为zip文件
			1.把文件下载到本地,放在在Apache环境下2.d.xlsx是某游戏的服务器名和玩家列表,本程序只适合此种xlsx文件结构,其他结构请修改index.php源码3.访问zip.php的功能是把生成的 ... 
- javascript判断设备类型-手机(mobile)、安卓(android)、电脑(pc)、其他(ipad/iPod/Windows)等
			使用device.js检测设备并实现不同设备展示不同网页 html代码: <!doctype html> <html> <head> <meta charse ... 
- ServletContext全局变量初始化
			Java部分 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.ser ... 
- Login过滤器
			继承自ActionFilterAttibute public override void OnActionExecuting(ActionExecutingContext filterContext) ... 
- Mac、Linux与Windows
			Mac本身是基于达尔文内核(Darwin内核),是苹果由UNIX改造的类UNIX,然后在这内核基础上搭建的图形界面 Linux确实是个好东西,你只需要一个键盘,一个显示器,一根网线,接入网络,便能做几 ... 
