2012-12-27 16 views
5

Tôi có hai quy trình có thể truy cập cùng một tệp một cách đồng thời và muốn triển khai khóa tệp. Vấn đề có vẻ là một quá trình được viết bằng java và một tiến trình khác trong C và không rõ ràng mức độ khóa thấp được thực hiện trên mặt java như thế nào. Nền tảng này là Solaris 10. Tôi đã cố gắng giới thiệu khóa trên tệp để ngăn các bản cập nhật đang được thực hiện bởi quá trình Java trong khi tiến trình C đang đọc tệp. Ý tưởng của tôi là cố gắng để có được một khóa từ mã java 10 lần và chỉ sau đó để vô điều kiện ghi vào tập tin (tôi cho rằng loại khóa là một khóa tư vấn). Tuy nhiên, java tryLock() phá vỡ quá trình C 'khóa trên nỗ lực thứ hai và tham nhũng đọc.Phương thức FileChannel tryLock() có kiểm tra khóa hoặc chỉ phá vỡ chúng không?

Đây là mã, đơn giản hóa (Java):

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 mã sử dụng fcntl:

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); 

Liệu tryLock() thực sự kiểm tra các khóa?

Trả lời

0

Tôi không chắc chắn nếu điều này sẽ giải quyết vấn đề của bạn hay không, nhưng trong các ví dụ mà tôi đã nhìn thấy trường l_pid của cấu trúc đàn được thiết lập như dưới đây.

fl.l_pid = getpid(); 

Trong câu hỏi của bạn, bạn không đặt trường này. Hãy thử xem nó có tạo nên sự khác biệt nào không. Tôi hy vọng điều đó sẽ hữu ích.

+0

Rất tiếc, nó không giúp ích gì. Dù sao, cảm ơn cho câu trả lời. – homerski

Các vấn đề liên quan