首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > 其他服务器 >

fcntl设定文件锁的有关问题

2012-02-07 
fcntl设定文件锁的问题,求助我想对一个文件实行排他锁,于是在dll里写了这样一个函数:int LockWholeFile(vo

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; 

你的文件是不是空的?
[解决办法]
我来截帖
看楼主回复内容.

热点排行