the related standard documentation के सावधानीपूर्वक पढ़ने के बावजूद, मैं समझ नहीं पा रहा हूं कि POSIX अनुपालन प्रणाली में अपेक्षित व्यवहार क्या है जब open
सिस्टम कॉल O_CREAT|O_DIRECTORY
सहित झंडे के साथ बुलाया जाता है।खुले (नाम, O_CREAT | O_DIRECTORY, मोड) के अपेक्षित व्यवहार क्या हैं?
मानक निर्दिष्ट करता है कि
O_CREAT और O_DIRECTORY सेट हैं और अनुरोध किया पहुँच मोड न O_WRONLY है और न ही O_RDWR है, परिणाम अनिर्दिष्ट है।
हालांकि यह सिस्टम के व्यवहार को (O_CREAT|O_DIRECTORY|O_WRONLY)
और न ही (O_CREAT|O_DIRECTORY|O_RDWR)
के साथ निर्दिष्ट नहीं करता है। दरअसल (जहां तक मैं समझ सकता हूं) EISDIR
पर व्यवहार केवल मौजूदा निर्देशिकाओं पर लागू होता है।
O_CREATE से संबंधित अनुभाग में, मानक यह बताता है कि, जब नामक फ़ाइल मौजूद नहीं है,
O_DIRECTORY फ़ाइल एक नियमित रूप से फ़ाइल के रूप में बनाया किया जाएगा सेट नहीं है; [...]
लेकिन फिर यह निर्दिष्ट नहीं करता है कि O_DIRECTORY
भी सेट होने पर क्या होगा।
मैं (एक POSIX एक के बावजूद वास्तव में नहीं है, जो एक व्यापक रूप से इस्तेमाल प्रणाली है) दोनों NetBSD और Linux (जो बेहद POSIX अनुपालन के बारे में बहुत परवाह करता है) के मैनुअल पृष्ठों देखा है, लेकिन मैं किसी भी स्पष्टीकरण नहीं मिल रहा।
क्या यह कहना सही है कि दोनों झंडे का उपयोग अनिर्दिष्ट है? और यदि हां, तो सबसे आम व्यवहार क्या है?
open(name, O_CREAT|O_DIRECTORY, mode)
mkdir
के बराबर किसी भी POSIX अनुपालन ओएस पर है?
if ((fmode & (O_CREAT | O_DIRECTORY)) == (O_CREAT | O_DIRECTORY))
return EINVAL;
इसलिए इन 2 के साथ किसी भी संयोजन सीधे ऊपर को अस्वीकार कर दिया गया है:
ध्यान दें कि आपको खुले झंडे (या संभवतः 'O_EXEC' या' O_SEARCH') में 'O_RDONLY', 'O_WRONLY', और' O_RDWR' में से एक को शामिल करना चाहिए)। ऐतिहासिक रूप से, उनको छोड़कर 'O_RDONLY' निर्दिष्ट करने के बराबर है (यह आमतौर पर 0 है;' O_WRONLY' सामान्यतः 1 है, और 'O_RDWR' सामान्यतः 2 है), लेकिन ये बिट मान नहीं हैं। (POSIX द्वारा निर्दिष्ट 'O_EXEC' और' O_SEARCH' विकल्प जीवन जटिल करते हैं, लेकिन न तो लिनक्स (उबंटू 16.04 एलटीएस) और न ही मैकोज़ 10.12.6 उनमें से किसी एक का समर्थन करता है।) अब मैं देखता हूं कि मुझे अपना 'दोषपूर्ण' कोड मिला - मैंने कॉपी किया आपके 'ओपन()' कमांड को महसूस किए बिना मैं नियमों का सख्ती से पालन नहीं कर रहा था। –
[ओपन() '] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) के लिए POSIX विनिर्देश के तर्क अनुभाग में, यह कहता है: _ इसके अलावा, 'खुला() 'O_DIRECTORY ध्वज सेट होने पर फ़ंक्शन गैर-निर्देशिकाओं को खोलने से इंकार कर देता है। यह रेस स्थितियों से बचाता है जिससे उपयोगकर्ता एक संवेदनशील फ़ाइल (उदाहरण के लिए, एक डिवाइस या एक फीफो) के लिए हार्ड लिंक को प्रतिस्थापित करके सिस्टम समझौता कर सकता है, जबकि एक विशेषाधिकार प्राप्त एप्लिकेशन चल रहा है, जहां पढ़ने के लिए भी फ़ाइल खोलने के लिए अवांछनीय दुष्प्रभाव हो सकते हैं ._ –