2009-02-25 9 views
7

यूनिक्स खुला() समारोह की परिभाषा जब O_CREAT ध्वज के साथ प्रयोग किया निर्दिष्ट है कि यह एक तिहाई फ़ाइलें 'विशेषाधिकार सेट करने के लिए मोड नामित तर्क की आवश्यकता है।मोड के बिना यूनिक्स O_CREAT झंडा

क्या होगा यदि मोड निर्दिष्ट नहीं है?

int file; 
static const char filename[] = "test.test"; 

if ((file = open(filename, O_RDWR | O_CREAT | O_TRUNC)) == 1) 
{ 
    perror("Error opening file."); 
    exit(EXIT_FAILURE); 
} 

close(file); 

उन झंडे का उपयोग करके बनाई गई फ़ाइल के साथ क्या होता है? अपने सिस्टम पर मैं:

-r--r-s--- 1 hyperboreean hyperboreean  0 2009-02-25 01:40 test.test 

एक सिद्धांत खुला समारोह ढेर और मोड पैरामीटर के लिए चेक पर लग रहा है कि और एक यादृच्छिक पूर्णांक यह पाता है का उपयोग कर समाप्त होता है।

मानक इस बारे में क्या कहता है?

+0

यही कारण है कि समारोह प्रोटोटाइप आविष्कार किया गया। – womble

+1

आपकी टिप्पणी समझ में नहीं आता है। – SoapBox

+0

यह वास्तव में नहीं है। और न तो डाउनवोट किया। – cdonner

उत्तर

1

हाइपरबोरियन, आपका संदेह चिह्न से बहुत दूर नहीं हो सकता है। मैं Kernighan Ritchie में उत्तर ढूंढने की उम्मीद कर रहा था। दुर्भाग्य से, मैंने नहीं किया। मुझे लगता है कि O_CREAT ध्वज के साथ अनुमति पैरामीटर आवश्यक है, और यदि आप इसे प्रदान नहीं करते हैं, तो खुले() स्टैक से यादृच्छिक मान खींचेंगे, जो निश्चित रूप से सी

संपादित करें: " यादृच्छिक "मेरा मतलब अनुमानित नहीं है। यह शायद रिटर्न पते का हिस्सा उठा रहा है, जो ढेर पर पैरामीटर के शीर्ष पर बैठता है।

2

अच्छा सवाल। mode मान प्रक्रिया के umask द्वारा संशोधित किया जाएगा। इसलिए यदि आप modeopen को O_CREAT ऑपरेशन में स्पष्ट रूप से open पास नहीं करते हैं, और यदि यह मोड के लिए यादृच्छिक बिट्स का उपयोग किया जाता है, तो उन यादृच्छिक बिट्स को umask द्वारा संशोधित किया जाएगा।

इच्छा मैं अधिक निश्चित और सटीक हो सकता हूं, लेकिन मैं cdonner से सहमत हूं कि umask के साथ "यादृच्छिक" मानों का उपयोग किया जा रहा है।

संपादित करें: एक चीज जिसे आप कोशिश कर सकते हैं, सिस्टम कॉल का पता लगाने के लिए डीआरएसएस या ट्रस या किसी अन्य सुविधा का उपयोग करना है, और mode के मूल्य को रन-टाइम पर देखने के लिए यह देखने के लिए कि क्या कुछ समझदार है या यह यादृच्छिक है बिट्स umask द्वारा संशोधित, उदाहरण के लिए।

+0

में ओवरलोडिंग के बारे में बात कर सकते हैं। मेरे परीक्षण में ptrace() , यह कुछ यादृच्छिक रूप से यादृच्छिक है, हालांकि मेरे मामले में यह हमेशा 11-बिट (ऑक्टेटल को इंगित करने के लिए अग्रणी 0 के साथ 12 बिट्स) है जो 2777 के साथ शुरू होता है। –

+0

02777 मान दिलचस्प है क्योंकि यह सेट-ग्रिड के साथ दुनिया को लिखने योग्य है बिट। खैर, मोड के बिना फाइल बनाने का एक अन्य कारण खतरनाक है। –

8

POSIX मानक (आईईईई 1003.1: 2008) के रूप में प्रोटोटाइप open():

int open(const char *path, int oflag, ...); 

अनुभाग O_CREAT के व्यवहार का वर्णन कहना नहीं है यदि आप आवश्यक तीसरा तर्क है, जो व्यवहार का मतलब छोड़ देते हैं तो क्या होगा अपरिभाषित है - कुछ भी संभव है।

अभ्यास में, ढेर के हिस्से के उपयोग कि फ्रेम ढेर या वापसी पते या कुछ इसी तरह पर दिया जाना था काफी संभावना है - एक उचित सन्निकटन कहता हूं, कि एक यादृच्छिक पूर्णांक माना जा सकता है।

POSIX 2008 मानक सहित, open() के लिए कुछ रोचक नई (और उपयोगी) झंडे है:

  • O_FDCLOEXEC खुला पर बंद-ऑन-कार्यकारी निर्दिष्ट करने के लिए।
  • O_DIRECTORY यह निर्दिष्ट करने के लिए कि फ़ाइल एक निर्देशिका होना चाहिए।
  • O_NOFOLLOW सिम्लिंक का पीछा न करने के लिए निर्दिष्ट करने के लिए।
0

रिकॉर्ड के लिए, सबसे libc सिस्टम पर, तो आप शायद va_arg, which states in it's man page के हाथों पर किया जाएगा:

If there is no next argument, or if type is not compatible with the 
    type of the actual next argument (as promoted according to the 
    default argument promotions), **random errors will occur**. 
int 
__libc_open64 (const char *file, int oflag, ...) 
{ 
    int mode = 0; 

    if (oflag & O_CREAT) 
    { 
     va_list arg; 
     va_start (arg, oflag); 
     mode = va_arg (arg, int); 
     va_end (arg); 
    } 

    if (SINGLE_THREAD_P) 
     return INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode); 

    int oldtype = LIBC_CANCEL_ASYNC(); 

    int result = INLINE_SYSCALL (open, 3, file, oflag | O_LARGEFILE, mode); 

    LIBC_CANCEL_RESET (oldtype); 

    return result; 
}