专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Solaris

fcntl设定文件锁的有关问题

发布时间:2011-06-27 19:13:00 文章来源:www.iduyao.cn 采编人员:星星草
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; 

你的文件是不是空的?
------解决方案--------------------
我来截帖
看楼主回复内容.
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: