fcntl设定文件锁的问题,求助
我想对一个文件实行排他锁,于是在dll里写了这样一个函数:
int LockWholeFile(void* fp)//fp是fopen的返回值
{
int fd;
struct flock stLock;
int nRet;
memset(&stLock, 0x00, sizeof(stLock));
fd = fileno((FILE*)fp);
TRACE("Begin to lock file,fp[%d], fd[%d]", fp, fd);
stLock.l_type = F_WRLCK;
stLock.l_whence = SEEK_SET;
stLock.l_start = 0;
stLock.l_len = 1;
nRet = fcntl(fd, F_SETLKW, &stLock);
if( nRet<0 )
{
TRACE("Lock file fp[%d] failed,errno[%d].", fp, errno);
return (-1);
}
TRACE("Lock file fp[%d] OK.", fp);
return (1);
}
然后在exe里调用LockWholeFile(fp);(确认fp有效)
但是每次执行,返回值都是-1,errno的值是14(EFAULT)
意思大概是无效的地址,百思不得其解,网上查了好些资料也没结果,郁闷:(
OS是solaris 10,64位系统。
将F_SETLKW和struct flock 换成64位的也是同样的错误,高手指点一下:(
[解决办法]
F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。
等待需要 3个条件
1 条件变量
2 互斥
3 判定
胡乱说的,
[解决办法]
我用你的函数在Solaris 10试过了,很正常,没有你说的问题。还是确认在LockWholeFile前:有没有对fp做一些不合理的操作
[解决办法]
其他进程是否正在使用该文件?
[解决办法]
EFAULT lock is outside your accessible address space.
stLock.l_start = 0;
stLock.l_len = 1;
你的文件是不是空的?
[解决办法]
我来截帖
看楼主回复内容.