当前位置: 技术问答>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))
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))