2012-12-27 17 views
5

Aynı dosyaya tutarlı bir şekilde erişebilen ve dosya kilitlemeyi uygulamak isteyen iki işlem var. Sorun, bir işlemin java'da ve diğeri C'de yazılması ve java tarafında ne kadar düşük seviyede kilitlemenin yapıldığının açık olmadığı gibi görünüyor. Platform, Solaris 10'dur. C süreci dosya okuyorken, Java işlemi tarafından yapılan güncellemeleri önlemek için dosya üzerinde kilitleme yapmayı denedim. Benim fikrim java kodundan 10 kez bir kilit elde etme girişiminde bulunmaktı ve sadece kayıtsız şartsız bir şekilde dosyaya yazdı (kilit tipinin bir danışmanlık kilidi olduğunu farz ettim). Ancak, java tryLock(), C işleminin ikinci girişimi üzerindeki kilidi bozar ve okumayı bozar.FileChannel tryLock() yöntemi kilitleri kontrol ediyor mu yoksa sadece kırıyor mu?

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() gerçekten kilit denetler mu:

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 kodu fcntl kullanır: Burada

basitleştirilmiş kod, (Java) nedir?

cevap

0

Sorunun çözülüp çözülmeyeceğinden emin değilim, ancak flock yapısının l_pid alanını gördüğüm örneklerde aşağıdaki gibi ayarlandı.

fl.l_pid = getpid(); 

Sorunuzda bu alanı ayarlamıyorsunuz. Herhangi bir fark yaratıp yaratmadığını deneyin. Umarım yardımcı olur.

+0

Maalesef bu yardımcı olmadı. Her neyse, cevap için teşekkürler. – homerski

İlgili konular