2010-04-03 12 views
6

(यह "HelloWorld" लिखने के लिए एक "HelloWorld" फ़ाइल में, और फिर पढ़ा पाठ चाहिए था) निम्नलिखित कोड को देखते हुए:सी प्रणाली खुला कॉल/पठन/लेखन/बंद और O_CREAT | O_EXCL

#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

#define FNAME "helloworld" 

int main(){ 
    int filedes, nbytes; 
    char buf[128]; 

    /* Creates a file */ 
    if((filedes=open(FNAME, O_CREAT | O_EXCL | O_WRONLY | O_APPEND, 
     S_IRUSR | S_IWUSR)) == -1){ 
      write(2, "Error1\n", 7); 
    } 

    /* Writes hello world to file */ 
    if(write(filedes, FNAME, 10) != 10) 
     write(2, "Error2\n", 7); 

    /* Close file */ 
    close(filedes); 

    if((filedes = open(FNAME, O_RDONLY))==-1) 
     write(2, "Error3\n", 7); 

    /* Prints file contents on screen */  
    if((nbytes=read(filedes, buf, 128)) == -1) 
     write(2, "Error4\n", 7); 

    if(write(1, buf, nbytes) != nbytes) 
     write(2, "Error5\n", 7); 

    /* Close file after read */ 
    close(filedes); 

    return (0); 
} 

पहली बार मैं कार्यक्रम चलाने के लिए, उत्पादन होता है: हर बार जब मैं कार्यक्रम चलाने के लिए

helloworld 

उसके बाद, उत्पादन होता है:

Error1 
Error2 
helloworld 

मुझे समझ में नहीं आता कि टेक्स्ट क्यों शामिल नहीं है, क्योंकि मैंने O_APPEND फ़ाइल निर्दिष्ट की है। ऐसा इसलिए है क्योंकि मैंने O_CREAT को शामिल किया है? यह फ़ाइल पहले ही बनाई गई है, क्या O_CREAT को अनदेखा नहीं किया जाना चाहिए?

उत्तर

11

O_EXCL फ़ाइल को बनाने के लिए मजबूर करता है। अगर फ़ाइल पहले से मौजूद है, तो कॉल विफल हो जाती है।

इसका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि फ़ाइल को तीसरे पैरामीटर में दी गई अनुमतियों के साथ बनाया जाना है।

  • O_CREAT: दी अनुमति के साथ फ़ाइल बनाएँ यदि फ़ाइल पहले से मौजूद नहीं संक्षेप में, आप इन विकल्प हैं। अगर फ़ाइल मौजूद है, तो यह खोला गया है और अनुमतियां अनदेखा की जाती हैं।
  • O_CREAT | O_EXCL: अगर फ़ाइल पहले से मौजूद नहीं है तो दिए गए अनुमतियों के साथ फ़ाइल बनाएं। अगर फ़ाइल मौजूद है, तो यह विफल हो जाती है। यह लॉकफाइल बनाने और फ़ाइल तक विशेष पहुंच की गारंटी के लिए उपयोगी है (जब तक कि सभी प्रोग्राम जो फ़ाइल का उपयोग उसी प्रोटोकॉल का पालन करते हैं)।
  • O_CREAT | O_TRUNC: अगर फ़ाइल पहले से मौजूद नहीं है तो दी गई अनुमतियों के साथ फ़ाइल बनाएं। अन्यथा, फ़ाइल को बाइट्स पर छोटा करें। जब हम सोचते हैं कि "एक नई खाली फ़ाइल बनाएं" तो इसका अधिक प्रभाव पड़ता है। फिर भी, यह मौजूदा फ़ाइल में पहले से मौजूद अनुमतियों को रखता है। the manual page से

अधिक जानकारी:

O_EXCL

जब O_CREAT के साथ प्रयोग किया है, अगर फ़ाइल पहले से मौजूद है यह एक त्रुटि और खुला() विफल हो जाएगा है। इस संदर्भ में, पर ध्यान दिए बिना, यह एक प्रतीकात्मक लिंक मौजूद है, जहां यह इंगित करता है। NFS फ़ाइल सिस्टम पर O_EXCL टूटा हुआ है; प्रोग्राम लॉकिंग कार्यों को करने के लिए इस पर भरोसा करते हैं जिसमें कार्य की स्थिति होगी। एक lockfile का उपयोग कर को एक ही फाइल प्रणाली पर एक अद्वितीय फ़ाइल बनाने है (उदाहरण के लिए, होस्टनाम और पीआईडी ​​को शामिल), उपयोग लिंक (2) lockfile के लिए एक लिंक बनाने के लिए परमाणु ताला फ़ाइल के प्रदर्शन के लिए समाधान। यदि लिंक() 0, लौटाता है तो लॉक सफल होता है। अन्यथा, स्टेट (2) का उपयोग अनन्य फ़ाइल पर की जांच करने के लिए करें, इसकी लिंक गणना में 2 हो गई है, जो लॉक सफल है।

+0

धन्यवाद, O_EXCL को हटाकर कोड कार्यात्मक है। क्या आप कृपया मुझे O_EXCL का उपयोग समझा सकते हैं। –

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