2012-12-27 20 views
5

मेरे पास दो प्रक्रियाएं हैं जो एक ही फाइल को निश्चित रूप से एक्सेस कर सकती हैं और फ़ाइल लॉकिंग को कार्यान्वित करना चाहती हैं। समस्या यह प्रतीत होती है कि एक प्रक्रिया जावा में और दूसरे में सी में लिखा गया है और यह स्पष्ट नहीं है कि जावा पक्ष पर निम्न स्तर की लॉकिंग कैसे लागू की जाती है। मंच सोलारिस 10 है। मैंने जावा प्रक्रिया द्वारा किए गए अपडेट को रोकने के लिए फ़ाइल पर लॉकिंग शुरू करने की कोशिश की, जबकि सी प्रक्रिया फाइल पढ़ रही है। मेरा विचार जावा कोड से 10 बार लॉक प्राप्त करने का प्रयास करना था और केवल तब फ़ाइल को बिना शर्त के लिखने के लिए (मुझे लगता है कि लॉक टाइप एक सलाहकार लॉक था)। हालांकि, जावा tryLock() दूसरे प्रक्रिया पर सी प्रक्रिया 'लॉक तोड़ता है और पढ़ने को दूषित करता है।क्या फाइलChannel tryLock() विधि ताले के लिए जांचती है या बस उन्हें तोड़ती है?

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() वास्तव में ताला के लिए जाँच करता है:

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){ 
      ..... 
     } 

    } 

सी कोड fcntl उपयोग करता है:

यहाँ कोड, सरलीकृत (जावा) है?

उत्तर

0

मुझे यकीन नहीं है कि यह आपकी समस्या का समाधान करेगा या नहीं, लेकिन उदाहरणों में मैंने देखा था कि झुंड संरचना के l_pid फ़ील्ड को नीचे सेट किया गया था।

fl.l_pid = getpid(); 

आपके प्रश्न में आप इस फ़ील्ड को सेट नहीं कर रहे हैं। कोशिश करें और देखें कि क्या इससे कोई फर्क पड़ता है। मुझे उम्मीद है कि यह मदद करता है।

+0

दुर्भाग्यवश इससे मदद नहीं मिली। वैसे भी, उत्तर के लिए धन्यवाद। – homerski

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^