当前位置:  技术问答>linux和unix

怎么判断一个文件已经被修改完了呢

    来源: 互联网  发布时间:2016-04-06

    本文导语:  http://topic.csdn.net/u/20071128/14/d8bb1141-9178-48ce-bc5f-fa18e8c59c4e.html。这个网页提供了一个vb的方法,不知道linux下c有没有类似的方法,谢谢 | 有一种方法,就是写文件时先对文件上锁,写完后对文件...

http://topic.csdn.net/u/20071128/14/d8bb1141-9178-48ce-bc5f-fa18e8c59c4e.html。这个网页提供了一个vb的方法,不知道linux下c有没有类似的方法,谢谢

|
有一种方法,就是写文件时先对文件上锁,写完后对文件解锁就可以了,关于文件锁的操作是:fcntl函数,用struct结构,建议你看看《精通Unix下c语言编程与项目实践》的文件锁部分6.9,以下是这本书关于锁的部分试读:
6.9.3 文件锁操作
在锁机制的使用中,最常见的操作有锁的请求、释放和测试等,这些操作代码基本类似,本处将一一说明。
1. 测试锁
设计函数SeeLock,它查询文件描述符fd对应文件的锁信息,其原型为:
void SeeLock(int fd, int start, int len);
本函数查询描述符fd对应文件从偏移start处开始的len字节中的锁信息,如代码6-5所示:
代码6-5 测试锁源码(节自/code/chapter6/lock1.c)
void SeeLock(int fd, int start, int len)
{
struct flock arg;
arg.l_type=F_WRLCK;
arg.l_whence = SEEK_SET;
arg.l_start = start;
arg.l_len = len;
if (fcntl(fd, F_GETLK, &arg) == -1) fprintf(stderr, "See Lock failed.n");
else if (arg.l_type == F_UNLCK) fprintf(stderr, "No Lock From %d To %dn", start, len);
else if (arg.l_type == F_WRLCK) fprintf(stderr, "Write Lock From %d To %d, id=%dn", start, len, arg.l_pid);
else if (arg.l_type == F_RDLCK) fprintf(stderr, "Read Lock From %d To %d, id=%dn", start, len, arg.l_pid);
}
2. 申请读锁
设计共享读锁申请函数GetReadLock,其原型为:
void GetReadLock(int fd, int start, int len);
本函数以阻塞模式在文件描述符fd对应的文件中申请共享读锁,锁定的区域为从偏移start处开始的len字节,如代码6-6所示:
代码6-6 阻塞申请共享读锁源码(节自/code/chapter6/lock1.c)
void GetReadLock(int fd, int start, int len)
{
struct flock arg;
arg.l_type=F_RDLCK;
arg.l_whence = SEEK_SET;
arg.l_start = start;
arg.l_len = len;
if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] Set Read Lock failed.n", getpid());
else fprintf(stderr, "[%d] Set Read Lock From %d To %dn", getpid(), start, len);
}
3. 申请写锁
设计互斥写锁申请函数GetWriteLock,其原型为:
void GetWriteLock(int fd, int start, int len)
本函数以阻塞模式在文件描述符fd对应的文件中申请互斥写锁,锁定的区域为从偏移start处开始的len字节,如代码6-7所示:
代码6-7 阻塞申请互斥写锁源码(节自/code/chapter6/lock1.c)
void GetWriteLock(int fd, int start, int len)
{
struct flock arg;
arg.l_type=F_WRLCK;
arg.l_whence = SEEK_SET;
arg.l_start = start;
arg.l_len = len;
if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] Set Write Lock failed.n", getpid());
else fprintf(stderr, "[%d] Set Write Lock From %d To %dn", getpid(), start, len);
}
4. 释放锁
设计文件锁释放函数ReleaseLock,其原型为:
void ReleaseLock(int fd, int start, int len);
本函数从文件描述符fd对应的文件中的释放锁,释放的区域为从偏移start处开始的len字节,如代码6-8所示:
代码6-8 释放锁源码(节自/code/chapter6/lock1.c)
void ReleaseLock(int fd, int start, int len)
{
struct flock arg;
arg.l_type=F_UNLCK;
arg.l_whence = SEEK_SET;
arg.l_start = start;
arg.l_len = len;
if (fcntl(fd, F_SETLKW, &arg) == -1) fprintf(stderr, "[%d] UnLock failed.n", getpid());
else fprintf(stderr, "[%d] UnLock From %d To %dn", getpid(), start, len);
}
实例
本处设计了一个文件锁控制进程的实例,如代码6-9所示:
代码6-9 释放锁源码(节自/code/chapter6/lock1.c)
#include 
#include 
void main()
{
int fd;
struct flock arg;
if ((fd = open("/tmp/tlock1", O_RDWR| O_CREAT, 0755)) 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Vectors 成员 empty():判断Vector是否为空(返回true时为空)
  • linux->shell-> if 条件判断,关于软连接的判断!
  • javascript操作html复选框checkbox:如何判断复选框是否被选中
  • shell如何判断文件是否存在,如何判断变量是否为空
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 怎么判断串口已经收到数据,并及时读出?怎么判断串口已经将写入的数据发送完毕?
  • java实现判断字符串是否全是数字的四种方法代码举例
  • 在判断自符是否等于**时,用equals(“**”),那么如果我想判断它的值是否>=2该用什么呢?
  • jquery iis7站长之家
  • linux 下的自解压文件是什么格式,如何判断文件是否为自解压c++或者脚本判断均可
  • mysql中如何判断当前是字符 mysql判断字段中有无汉字
  • 知道TCP/UDP的包头,如何判断其应用层协议类型,struct tcphdr和 struct udphdr结构中那个变量能判断应用层协议类型。
  • c#判断字符是否为中文的三种方法分享(正则表达式判断)
  • 如何判断在线用户,主要是如何判断用户关闭所有窗口(即他已经不在线了)?
  • 如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?
  • 判断图片-判断位图是否是黑白图片的方法
  • JQuery 判断某个属性是否存在hasAttr用法
  • 请问如何判断一个文件夹是否存在
  • 判断文件格式的c库函数
  • sftp命令如何判断成功与否?
  • Shell条件判断疑问?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3