सार
# शामिल << एक HREF = "फ़ाइल: /usr/include/sys/types.h"> sys / type.h> # शामिल << एक HREF = "फ़ाइल: /usr/include/sys/stat.h"> sys / stat.h> # शामिल << एक HREF = "फ़ाइल: /usr/include/fcntl.h"> fcntl.h> int खुला ( कॉन्स char * पथनाम , int झंडे ); int खुला ( कॉन्स char * पथनाम , int झंडे , mode_t मोड ); int creat (const char * pathname , mode_t मोड );विवरण
ओपन () सिस्टम कॉल लिनक्स कमांड का उपयोग पथनाम को फ़ाइल डिस्क्रिप्टर में परिवर्तित करने के लिए किया जाता है (बाद में I / O में पढ़ने के लिए एक छोटा, गैर-ऋणात्मक पूर्णांक पढ़ने , लिखने आदि के साथ)। जब कॉल सफल होता है, तो फाइल डिस्क्रिप्टर वापस सबसे कम फ़ाइल डिस्क्रिप्टर होता है जो वर्तमान में प्रक्रिया के लिए खुला नहीं होता है। यह कॉल एक नई खुली फ़ाइल बनाता है, किसी अन्य प्रक्रिया के साथ साझा नहीं किया जाता है। (लेकिन साझा खुली फ़ाइलें कांटा (2) सिस्टम कॉल के माध्यम से उत्पन्न हो सकती हैं।) नई फ़ाइल डिस्क्रिप्टर निष्पादित कार्यों में खुली रहने के लिए सेट है ( fcntl (2) देखें)। फ़ाइल ऑफसेट फ़ाइल की शुरुआत में सेट है।
पैरामीटर झंडे O_RDONLY , O_WRONLY या O_RDWR में से एक है जो केवल पढ़ने के लिए फ़ाइल खोलने का अनुरोध करता है, क्रमशः केवल लिखना या पढ़ना / लिखना, बिटवाई- या 'शून्य या निम्न में से अधिक के साथ डी:
O_CREAT
अगर फ़ाइल मौजूद नहीं है तो यह बनाया जाएगा। फ़ाइल का मालिक (उपयोगकर्ता आईडी) प्रक्रिया की प्रभावी उपयोगकर्ता आईडी पर सेट है। समूह स्वामित्व (समूह आईडी) या तो प्रक्रिया की प्रभावी समूह आईडी या मूल निर्देशिका की समूह आईडी (फाइल सिस्टम प्रकार और माउंट विकल्प के आधार पर, और मूल निर्देशिका के मोड के आधार पर सेट किया गया है, देखें, उदाहरण के लिए, माउंट माउंट (8) में वर्णित अनुसार ext2 फाइल सिस्टम के bsdgroups और sysvgroups विकल्प।
O_EXCL
जब O_CREAT के साथ उपयोग किया जाता है, यदि फ़ाइल पहले से मौजूद है तो यह एक त्रुटि है और खुली विफल हो जाएगी। इस संदर्भ में, इसके प्रतीकों के बावजूद, एक प्रतीकात्मक लिंक मौजूद है। ओ_एक्ससीएल एनएफएस फाइल सिस्टम पर टूटा हुआ है, प्रोग्राम जो लॉकिंग कार्यों को करने के लिए भरोसा करते हैं, उनमें दौड़ की स्थिति होगी। लॉकफ़ाइल का उपयोग करके परमाणु फ़ाइल लॉकिंग करने का समाधान एक ही fs (उदाहरण के लिए, होस्टनाम और पिड को शामिल करना) पर एक अनन्य फ़ाइल बनाना है, लॉकफ़ाइल के लिए लिंक बनाने के लिए लिंक (2) का उपयोग करें । अगर लिंक () 0 देता है, तो लॉक सफल होता है। अन्यथा, अद्वितीय फ़ाइल पर स्टेट (2) का उपयोग यह जांचने के लिए करें कि इसकी लिंक गिनती 2 हो गई है, इस स्थिति में लॉक भी सफल है।
O_NOCTTY
यदि पथनाम टर्मिनल डिवाइस को संदर्भित करता है --- tty (4) देखें --- यह प्रक्रिया के नियंत्रण टर्मिनल नहीं बन जाएगी, भले ही प्रक्रिया में कोई न हो।
O_TRUNC
अगर फ़ाइल पहले से मौजूद है और एक नियमित फाइल है और ओपन मोड लेखन की अनुमति देता है (यानी, ओ_आरडीडब्ल्यूआर या ओ_WRONLY है) तो इसे 0 लंबाई तक छोटा कर दिया जाएगा। यदि फ़ाइल एक फीफो या टर्मिनल डिवाइस फ़ाइल है, तो O_TRUNC ध्वज को अनदेखा कर दिया जाता है। अन्यथा, O_TRUNC का प्रभाव अनिर्दिष्ट है। (कई लिनक्स संस्करणों पर इसे अनदेखा कर दिया जाएगा; अन्य संस्करणों पर, यह एक त्रुटि लौटाएगा।)
O_APPEND
फ़ाइल संलग्न मोड में खोला गया है। प्रत्येक लिखने से पहले, फाइल पॉइंटर फ़ाइल के अंत में स्थित होता है, जैसे कि lseek के साथ। O_APPEND एनएफएस फ़ाइल सिस्टम पर दूषित फ़ाइलों का कारण बन सकता है यदि एक से अधिक प्रक्रिया डेटा को एक बार में फ़ाइल में जोड़ती है । ऐसा इसलिए है क्योंकि एनएफएस किसी फ़ाइल में संलग्न करने का समर्थन नहीं करता है, इसलिए क्लाइंट कर्नेल को इसे अनुकरण करना होता है, जिसे दौड़ की स्थिति के बिना नहीं किया जा सकता है।
O_NONBLOCK या O_NDELAY
जब संभव हो, फ़ाइल गैर-अवरुद्ध मोड में खोली जाती है। फाइल डिस्क्रिप्टर पर खुले न ही खुले और बाद के किसी भी ऑपरेशन से कॉलिंग प्रक्रिया का इंतजार होगा। एफआईएफओ (नामित पाइप) के संचालन के लिए, फीफो (4) भी देखें। इस मोड को फीफो के अलावा अन्य फ़ाइलों पर कोई प्रभाव नहीं पड़ता है।
O_SYNC
फाइल सिंक्रोनस I / O के लिए खोला गया है। परिणामस्वरूप फ़ाइल डिस्क्रिप्टर पर कोई भी लेखन कॉलिंग प्रक्रिया को अवरुद्ध कर देगा जब तक कि डेटा अंतर्निहित हार्डवेयर को भौतिक रूप से लिखा नहीं जाता है। हालांकि, नीचे प्रतिबंध देखें।
O_NOFOLLOW
यदि पथनाम एक प्रतीकात्मक लिंक है, तो खुला विफल रहता है। यह एक फ्रीबीएसडी एक्सटेंशन है, जिसे संस्करण 2.1.126 में लिनक्स में जोड़ा गया था। पथनाम के पुराने घटकों में प्रतीकात्मक लिंक अभी भी पालन किए जाएंगे। Glibc 2.0.100 से हेडर और बाद में इस ध्वज की परिभाषा शामिल है; यदि 2.1.126 से पहले कर्नेल इसे इस्तेमाल करते हैं तो इसे अनदेखा कर देगा ।
O_DIRECTORY
यदि पथनाम निर्देशिका नहीं है, तो विफल होने के कारण खोलें। यह ध्वज लिनक्स-विशिष्ट है, और कर्नेल संस्करण 2.1.126 में जोड़ा गया था, अगर इन्हें एफआईएफओ या टेप डिवाइस पर ओपेन्डर (3) कहा जाता है, तो इनकार करने की सेवा समस्याओं से बचने के लिए, लेकिन opendir के कार्यान्वयन के बाहर उपयोग नहीं किया जाना चाहिए ।
O_DIRECT
इस फ़ाइल से I / O के कैश प्रभाव को कम करने का प्रयास करें। आम तौर पर यह प्रदर्शन को कम कर देगा, लेकिन यह विशेष परिस्थितियों में उपयोगी है, जैसे कि जब अनुप्रयोग अपनी कैशिंग करते हैं। फ़ाइल I / O उपयोगकर्ता स्पेस बफर से सीधे / से किया जाता है। I / O सिंक्रोनस है, यानी, पढ़ने (2) या लिखने (2) सिस्टम कॉल के पूरा होने पर, डेटा को स्थानांतरित करने की गारंटी है। स्थानांतरण आकार, और उपयोगकर्ता बफर और फ़ाइल ऑफ़सेट के संरेखण फ़ाइल सिस्टम के तार्किक ब्लॉक आकार के गुणक होना चाहिए।
यह ध्वज कई यूनिक्स जैसी प्रणालियों पर समर्थित है; कर्नेल संस्करण 2.4.10 में लिनक्स के तहत समर्थन जोड़ा गया था।
ब्लॉक उपकरणों के लिए एक अर्थात् समान इंटरफेस कच्चे (8) में वर्णित है।
O_ASYNC
एक सिग्नल जेनरेट करें (डिफ़ॉल्ट रूप से सिगियो, लेकिन इसे fcntl (2) के माध्यम से बदला जा सकता है) जब इस फ़ाइल डिस्क्रिप्टर पर इनपुट या आउटपुट संभव हो जाता है। यह सुविधा केवल टर्मिनलों, छद्म टर्मिनलों और सॉकेट के लिए उपलब्ध है। अधिक जानकारी के लिए fcntl (2) देखें।
O_LARGEFILE
बड़ी फाइल सिस्टम का समर्थन करने वाले 32-बिट सिस्टम पर, उन फ़ाइलों को अनुमति दें जिनके आकार 31 बिट्स में खोले जाने के लिए प्रदर्शित नहीं किए जा सकते हैं।
फ़ाइल खोले जाने के बाद इनमें से कुछ वैकल्पिक झंडे fcntl का उपयोग करके बदला जा सकता है।
तर्क मोड किसी नई फ़ाइल के निर्माण के मामले में उपयोग करने के लिए अनुमतियों को निर्दिष्ट करता है। इसे प्रक्रिया के उमास्क द्वारा सामान्य तरीके से संशोधित किया जाता है: बनाई गई फ़ाइल की अनुमतियां (मोड और ~ उमास्क) होती हैं । ध्यान दें कि यह मोड केवल नव निर्मित फ़ाइल के भविष्य के उपयोग पर लागू होता है; ओपन कॉल जो केवल पढ़ने-योग्य फ़ाइल बनाता है, एक अच्छी तरह से पढ़ / लिखने वाली फ़ाइल डिस्क्रिप्टर लौटा सकता है।
मोड के लिए निम्नलिखित प्रतीकात्मक स्थिरांक प्रदान किए जाते हैं:
S_IRWXU
00700 उपयोगकर्ता (फ़ाइल स्वामी) ने अनुमति को पढ़, लिख और निष्पादित किया है
S_IRUSR (S_IREAD)
00400 उपयोगकर्ता को पढ़ने की अनुमति है
S_IWUSR (S_IWRITE)
00200 उपयोगकर्ता के पास लिखने की अनुमति है
S_IXUSR (S_IEXEC)
00100 उपयोगकर्ता को निष्पादन अनुमति है
S_IRWXG
00070 समूह ने अनुमति को पढ़, लिख और निष्पादित किया है
S_IRGRP
00040 समूह में पढ़ने की अनुमति है
S_IWGRP
00020 समूह में लेखन की अनुमति है
S_IXGRP
00010 समूह निष्पादन अनुमति है
S_IRWXO
00007 अन्य ने अनुमति को पढ़, लिखना और निष्पादित किया है
S_IROTH
00004 दूसरों को पढ़ने की अनुमति है
S_IWOTH
00002 दूसरों के पास लिखने की अनुमति है
S_IXOTH
00001 अन्य लोगों को निष्पादन की अनुमति है
मोड निर्दिष्ट होना चाहिए जब O_CREAT झंडे में है , और अन्यथा अनदेखा किया जाता है।
रचना O_CREAT | O_WRONLY | O_TRUNC के बराबर झंडे के साथ खोलने के बराबर है।
प्रतिलाभ की मात्रा
खुला और क्रिएट नई फ़ाइल डिस्क्रिप्टर, या -1 अगर कोई त्रुटि हुई (जिस स्थिति में, इरनो उचित रूप से सेट किया गया है) लौटाता है। ध्यान दें कि खुले डिवाइस विशेष फ़ाइलों को खोल सकते हैं, लेकिन रचना उन्हें नहीं बना सकती - इसके बजाय mknod (2) का उपयोग करें।
यूआईडी मैपिंग सक्षम के साथ एनएफएस फाइल सिस्टम पर, खुले एक फ़ाइल डिस्क्रिप्टर वापस कर सकते हैं, लेकिन उदाहरण के लिए (2) अनुरोध ईएसीसीईएस से इनकार कर दिया गया है। ऐसा इसलिए है क्योंकि क्लाइंट अनुमतियों की जांच करके खुले प्रदर्शन करता है, लेकिन यूआईडी मैपिंग सर्वर द्वारा पढ़ने और लिखने के अनुरोधों पर किया जाता है।
अगर फ़ाइल को नया बनाया गया है, तो इसके एटीम, सीटाइम, एमटाइम फ़ील्ड्स वर्तमान समय पर सेट हैं, और इसलिए मूल निर्देशिका के सीटा और माइट फ़ील्ड भी हैं। अन्यथा, यदि O_TRUNC ध्वज के कारण फ़ाइल संशोधित की गई है, तो इसके सीटा और माटा फ़ील्ड वर्तमान समय पर सेट हैं।
त्रुटियाँ
EEXIST
पथनाम पहले से मौजूद है और O_CREAT और O_EXCL का उपयोग किया गया था।
EISDIR
पथनाम एक निर्देशिका को संदर्भित करता है और अनुरोधित अनुरोध शामिल है (यानी, O_WRONLY या O_RDWR सेट है)।
EACCES
फ़ाइल में अनुरोधित पहुंच की अनुमति नहीं है, या पथनाम में निर्देशिकाओं में से एक ने खोज (निष्पादन) अनुमति की अनुमति नहीं दी है, या फ़ाइल अभी तक मौजूद नहीं है और मूल निर्देशिका तक पहुंच लिखने की अनुमति नहीं है।
ENAMETOOLONG
पथनाम बहुत लंबा था।
ENOENT
O_CREAT सेट नहीं है और नामित फ़ाइल मौजूद नहीं है। या, पथनाम में एक निर्देशिका घटक मौजूद नहीं है या एक लटकन प्रतीकात्मक लिंक है।
ENOTDIR
पथनाम में निर्देशिका के रूप में उपयोग किया जाने वाला एक घटक वास्तव में एक निर्देशिका नहीं है, या O_DIRECTORY निर्दिष्ट किया गया था और पथनाम निर्देशिका नहीं था।
ENXIO
O_NONBLOCK | O_WRONLY सेट है, नामित फ़ाइल एक फीफो है और पढ़ने के लिए फ़ाइल को खोलने के लिए कोई प्रक्रिया नहीं है। या, फ़ाइल एक डिवाइस विशेष फ़ाइल है और कोई संबंधित डिवाइस मौजूद नहीं है।
ENODEV
पथनाम एक डिवाइस विशेष फ़ाइल को संदर्भित करता है और कोई संबंधित डिवाइस मौजूद नहीं है। (यह एक लिनक्स कर्नेल बग है - इस स्थिति में ENXIO वापस किया जाना चाहिए।)
EROFS
पथनाम केवल पढ़ने-योग्य फाइल सिस्टम पर एक फ़ाइल को संदर्भित करता है और लेखन पहुंच का अनुरोध किया गया था।
ETXTBSY
पथनाम एक निष्पादन योग्य छवि को संदर्भित करता है जिसे वर्तमान में निष्पादित किया जा रहा है और लेखन लेखन का अनुरोध किया गया था।
EFAULT
आपके सुलभ पता स्थान के बाहर पथनाम बिंदु।
ELOOP
पथनाम को हल करने में बहुत से प्रतीकात्मक लिंक सामने आए थे, या O_NOFOLLOW निर्दिष्ट किया गया था लेकिन पथनाम एक प्रतीकात्मक लिंक था।
ENOSPC
पथनाम बनाया जाना था, लेकिन पथनाम वाले डिवाइस में नई फ़ाइल के लिए कोई जगह नहीं है।
ENOMEM
अपर्याप्त कर्नेल मेमोरी उपलब्ध थी।
EMFILE
प्रक्रिया में पहले से ही फाइलों की अधिकतम संख्या खुली है।
ENFILE
सिस्टम पर खुली फाइलों की कुल संख्या पर सीमा तक पहुंच गई है।
के अनुरूप करना
एसवीआर 4, एसवीआईडी, पॉज़िक्स, एक्स / ओपन, बीएसडी 4.3 ओ_नॉफोलो और ओ_DIRECTORY झंडे लिनक्स- विशिष्ट हैं। किसी को अपनी परिभाषा प्राप्त करने के लिए _GNU_SOURCE मैक्रो को परिभाषित करना पड़ सकता है।
प्रतिबंध
एनएफएस अंतर्निहित प्रोटोकॉल में कई infelicities हैं, अन्य O_SYNC और O_NDELAY के बीच प्रभावित।
POSIX ध्वज O_SYNC , O_DSYNC और O_RSYNC के अनुरूप सिंक्रनाइज़ I / O के तीन अलग-अलग प्रकारों के लिए प्रदान करता है। वर्तमान में (2.1.130) ये सब लिनक्स के समानार्थी हैं।