首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FileChannel tryLock()方法是检查锁还是解锁?

FileChannel tryLock()方法是检查锁还是解锁?
EN

Stack Overflow用户
提问于 2012-12-27 17:53:40
回答 1查看 1K关注 0票数 5

我有两个进程可以并发访问同一个文件,并希望实现文件锁定。问题似乎是,一个进程是用java编写的,另一个是用C编写的,并且不清楚在Java端如何实现低级锁定。平台是Solaris 10。我尝试在文件上引入锁定,以防止在C进程读取文件时由Java进程进行更新。我的想法是尝试从java代码获取锁10次,然后才无条件地写入文件(我假设锁类型是建议锁)。然而,java tryLock()在第二次尝试时打破了C进程的锁,并破坏了读取。

以下是代码,简化(Java):

代码语言:javascript
复制
    int iAttemptCnt = 0;
              FileChannel wchannel = new FileOutputStream(new File(fileName), false).getChannel();;
              FileLock flock;
    while(true){
        try{
            MyLog.log(MyLog.LVL_INFO, "attempt to lock  file");
            if( (flock = wChannel.tryLock()) == null ){
                // lock held by another program
                if(++iAttemptCnt >= 10 
                    break;                  
            }
            else{
                MyLog.log(MyLog.LVL_INFO, " file locked");
                break;
            }
        }catch(OverlappingFileLockException ofle){
            .......                     
            if(++iAttemptCnt >= 10 ){
            ...
                break;          
            }                   
        }catch(IOException ioe){
            throw new IOException("failed to lock the  file");
        }
        try{
            MyLog.log(MyLog.LVL_INFO, "File already locked, retrying in one second");
            Thread.sleep(1000);
        }catch(InterruptedException ie){
            .....
        }

    }

C代码使用fcntl:

代码语言:javascript
复制
fd = open(filename, O_RDONLY);

.....

lck.l_type = F_RDLCK;/* F_RDLCK setting a shared or read lock */ 

lck.l_whence = 0; /* offset l_start from beginning of file */ 

lck.l_start = 0LL; 

lck.l_len = 0LL; /* until the end of the file address space */ 

....

while(  fcntl(fd, F_SETLK64, &lck) < 0){ 

  if( errno == EAGAIN )

    ....    
  else if (errno == EIO )

     ...

  else if( errno == ENOLCK)

     ...

  else if (errno == EDEADLK)

     ...
  if(++ii == 10 ){     

    break;
  }

  ...    

  sleep(1);
} 

 MyLongLastingRead();

...
lck.l_type = F_UNLCK;

fcntl(fd, F_SETLK, &lck);

close(fd);

tryLock()真的会检查锁吗?

EN

回答 1

Stack Overflow用户

发布于 2012-12-30 23:38:48

我不确定这是否能解决你的问题,但是在我见过的例子中,flock structure的l_pid字段设置如下。

代码语言:javascript
复制
fl.l_pid = getpid();

在您的问题中,您没有设置此字段。试着看看这是否有什么不同。我希望它能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14052656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档