fcntl 函数与文件锁
一、fcntl函数
功能:操纵文件描述符,改变已打开的文件的属性
int fcntl(int fd, int cmd, ... /* arg */ );
cmd的取值可以如下:
复制文件描述符
F_DUPFD (long)
设置/获取文件描述符标志
F_GETFD (void)
F_SETFD (long)
设置/获取文件状态标志
F_GETFL (void)
F_SETFL (long)
获取/设置文件锁
F_GETLK
F_SETLK,F_SETLKW
其中复制文件描述符可参见《linux系统编程之文件与I/O(五):打开文件的内核结构file和重定向》,文件描述符的标志只有一个即FD_CLOEXEC,设置/获取文件描述符标志看这里。下面先来看设置/获取文件状态标志。
F_SETFL:
On Linux this command can change only the O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK flags.
示例程序如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
/*************************************************************************
> File Name: file_fcntl.c > Author: Simba > Mail: dameng34@163.com > Created Time: Sat 23 Feb 2013 02:34:02 PM CST ************************************************************************/ #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #define ERR_EXIT(m) \ void set_flag(int, int); int main(int argc, char *argv[]) printf("buf=%s\n", buf); void set_flag(int fd, int flags) void clr_flag(int fd, int flags) |
测试输出:
simba@ubuntu:~/Documents/code/linux_programming/APUE/File_IO$ ./file_fcntl
read error: Resource temporarily unavailable
因为将标准输入的状态更改为非阻塞,则read不会阻塞等待输入而立即返回错误,errno将被置为EAGAIN,即可以重新尝试。
二、文件锁结构体
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_whence, l_start, l_len 决定了被锁定的文件范围。当fcntl 函数的cmd为F_GETLK时,flock 结构体的
l_pid 参数会返回持有写锁的进程id。进程退出或者文件描述符被关闭时,会释放所有的锁。
示例程序如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/*************************************************************************
> File Name: file_flock.c > Author: Simba > Mail: dameng34@163.com > Created Time: Sat 23 Feb 2013 02:34:02 PM CST ************************************************************************/ #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #define ERR_EXIT(m) \ int main(int argc, char *argv[]) if (fcntl(fd, F_SETLK, &lock) == 0) return 0; //进程退出会对所有文件解锁 |
测试如下:
我们先在一个 终端执行程序:
simba@ubuntu:~/Documents/code/linux_programming/APUE/File_IO$ ./file_flock
lock success
press any key to unlock
现在文件已经被锁住了,而且没有按下任何按键,所以卡在这里,也还没解锁,接着在另一个终端再次执行同个程序:
simba@ubuntu:~/Documents/code/linux_programming/APUE/File_IO$ ./file_flock
lock fail: Resource temporarily unavailable
会立即返回错误,因为我们希望施加的是排他锁,而现在前面一个进程正在占用写锁还没释放,所以尝试施加锁失败,而如果fcntl 函数的cmd 设置为 F_SETLKW,即带w的版本,则此进程会一直阻塞直到前面一个进程释放了锁。
参考:《APUE》
fcntl 函数与文件锁的更多相关文章
- fcntl函数加文件锁
对文件加锁是原子性的,可以用于进程间文件操作的同步.在linux下,有三个函数可以对文件进程加锁,分别是fcntl.flock.lockf.这里只说fcntl,它的用法也是最复杂的. fcntl是fi ...
- [Linux]fcntl函数文件锁概述
概述 fcntl函数文件锁有几个比较容易忽视的地方: 1.文件锁是真的进程之间而言的,调用进程绝对不会被自己创建的锁锁住,因为F_SETLK和F_SETLKW命令总是替换调用进程现有的锁(若已存在), ...
- Linux 系统 文件锁 fcntl函数详解
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int ...
- fcntl函数用法——设置文件锁
fcntl函数.锁定文件,设置文件锁.设置获取文件锁:F_GETLK .F_SETLK .F_SETLKW文件锁结构,设置好用于fcntl函数的第三个参数.struct flock{ shor ...
- linxu fcntl 函数用法 【转】
功能描述:根据文件描述词来操作文件的特性. 文件控制函数 fcntl -- file control 头文件: #include <fcntl.h>; i ...
- Linux系统编程(3)——文件与IO之fcntl函数
linux文件I/O用:open.read.write.lseek以及close函数实现了文件的打开.读写等基本操作.fcntl函数可以根据文件描述词来操作文件. 用法: int fcntl(int ...
- 六、文件IO——fcntl 函数 和 ioctl 函数
6.1 fcntl 函数 6.1.1 函数介绍 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd ...
- fcntl函数用法详解
功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd) ...
- 文件控制 fcntl函数具体解释
摘要:本文主要讨论文件控制fcntl函数的基本应用.dup函数能够拷贝文件描写叙述符,而fcntl函数与dup函数有着异曲同工之妙.而且还有更加强大的功能,能够获取或设置已打开文件的性质,操作文件锁. ...
随机推荐
- (转)unity3d中脚本生命周期(MonoBehaviour lifecycle)
自:http://blog.csdn.net/qitian67/article/details/18516503 最近在做一个小示例,发现类继承于MonoBehaviour的类,有很多个方法,于是乎必 ...
- 向量的表示及协方差矩阵 (PCA的理论基础)
原文:http://blog.csdn.net/songzitea/article/details/18219237 引言 当面对的数据被抽象为一组向量,那么有必要研究一些向量的数学性质.而这些数学性 ...
- ab测试工具参数详解
-n 测试会话中所执行的请求个数,默认仅执行一个请求 -c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个 -t 测试所进行的最大秒数,默认为无时间限制....其内部隐含值是[-n 50 ...
- AutoPlay Menu Builder入门教程
1 拖动窗口可以设置主界面的窗口大小,在下面有版面预览 2 常用东西介绍.右侧的素材库除了按钮还有图像,背景,音乐等.使用按钮的时候选中需要的按钮样式,双击即可上屏.图形按钮即使可以使用图像作为背景的 ...
- easyui问题小结
http://blog.sina.com.cn/s/blog_77cb836301017lrd.html
- vbScript 备忘
closeCDRom.vbs Set Obj=CreateObject("WMPlayer.OCX.7") Set CD=Obj.CDROMCollection then CD.I ...
- js-取值&赋值-获取某标签某属性的值
js 取值&赋值-获取某标签某属性的值 CreateTime--2016年10月16日16:35:34 Author:Marydon 1.取值 //方法一 //自定义属性必须用getAtt ...
- eclipse could not create the Java Vitual Machine
eclipse could not create the Java Vitual Machine CreateTime--2018年4月27日11:07:15 Author:Marydon 1.情 ...
- 〖Linux〗Clang/Clang++ for Android Binary/NDK build(二进制可执行文件/NDK编译)
#1. 下载并安装NDK(解压即可,目前最新版是r9c) http://developer.android.com/tools/sdk/ndk/index.html #2. 安装NDK独立编译工具 c ...
- Android进程注入
全部代码在这里下载:http://download.csdn.net/detail/a345017062/8133239 里面有两个exe.inj是一个C层进程注入的样例.inj_dalvik是我写的 ...