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 mvc+web api+easyui
前奏:第一次写博客,记录一下学习和开发的过程. 现在写的是一个后台管理系统,有基本的权限功能,其他功能都可以扩展.用到的技术是 asp.net mvc5,web api 2,entityframewo ...
- 使用linq获得当前文件夹下的下一级满足条件的文件夹
使用linq获得当前文件夹下的下一级满足条件的文件夹. SPFolderCollection subAlbums = Folder.SubFolders; ...
- [GDI+] 生成缩略图的类文件SmallImage (转载)
直接看代码吧,大家可以直接复制使用 /// <summary> /// 类说明:SmallImage类, /// 编码日期:2012-08-20 /// 编 码 人: 苏飞 /// 联系方 ...
- 多线程、Socket
多线程 线程.进程和应用程序域 进程:进程是一个操作系统上的概念,用来实现多任务并发执行,是资源分配的最小单元,各个进程是相互独立的,可以理解为执行当中的程序,在操作系统中一般用一个称为PCB的结 ...
- ios开发中MVC模式的理解
MVC是80年代出现的一种软件设计模式,是模型(model),视图(view)和控制(Controller)的缩写. 其中Model的主要功能包括业务逻辑的处理以及数据的访问,这是应用程序的主体部分. ...
- java_设计模式_迭代器模式_Iterator Pattern(2016-08-12)
迭代子(Iterator)模式又叫游标(Cursor)模式,是对象的行为模式. 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中 ...
- IOC容器 - Autofac概述
Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...
- QTableWidget中添加按钮
添加按钮 void QTableWidget::setCellWidget ( int row, int column, QWidget * widget ) widget可以是自己定义的按钮 cla ...
- 用QT 还是MFC ? (转)
我曾经使用过QT和MFC来开发过软件,我想和大家分享我使用他们时所体会的不同之处. 我并非一个职业作家,这篇文章可能看起来不如专业的杂志和网站上的那么条理清晰.但是,我在这里是用我自己的语言来表达我自 ...
- U盘安装ubuntu时出现的gfxboot.c32:not a COM32R image问题
方法特别简单:只需在提示后面输入 live 然后回车 就OK了