मानकीकरण करने से पहले ioctl(
... FIONBIO
... )
और fcntl(
... O_NDELAY
... )
, लेकिन ये सिस्टम के बीच असंगत व्यवहार करते थे, और एक ही प्रणाली के भीतर भी। उदाहरण के लिए, FIONBIO
सॉकेट्स पर काम करना और O_NDELAY
टिट्स पर काम करना आम बात थी , जिसमें पाइप, फीफो और डिवाइस जैसी चीजों के लिए बहुत अधिक असंगतता थी। और अगर आपको नहीं पता था कि आपके पास किस तरह का फाइल डिस्क्रिप्टर है, तो आपको यह सुनिश्चित करने के लिए दोनों सेट करना होगा। लेकिन इसके अलावा, बिना डेटा उपलब्ध न होने वाले रीड को भी असंगत रूप से इंगित किया गया था; OS पर निर्भर करता है और फ़ाइल डिस्क्रिप्टर के प्रकार को पढ़ने के लिए 0, या -1 के साथ इरोजेन, या -1 के साथ इवानो टूलडॉक के साथ वापस आ सकता है। आज भी, सेटिंग FIONBIO
याO_NDELAY
सोलारिस पर 0 या टैटी या पाइप पर 0 लौटने के लिए कोई डेटा नहीं है, या सॉकेट पर गलत EAGAIN के साथ -1 का कारण बनता है। हालाँकि, यह अस्पष्ट है क्योंकि यह EOF के लिए भी लौटा है।
POSIX ने इसे पेश करने के साथ संबोधित किया O_NONBLOCK
, जिसने विभिन्न प्रणालियों और फ़ाइल डिस्क्रिप्टर प्रकारों में मानकीकृत व्यवहार किया है। क्योंकि मौजूदा सिस्टम आमतौर पर व्यवहार में किसी भी बदलाव से बचना चाहते हैं जो पिछड़ी अनुकूलता को तोड़ सकता है, POSIX ने दूसरों के लिए विशिष्ट व्यवहार को अनिवार्य करने के बजाय एक नया झंडा परिभाषित किया। लिनक्स जैसी कुछ प्रणालियाँ सभी 3 को समान मानती हैं, और EAGAIN और EWOULDBLOCK को भी समान मान से परिभाषित करती हैं, लेकिन पिछड़ी अनुकूलता के लिए कुछ अन्य विरासत व्यवहार को बनाए रखने की इच्छा रखने वाले सिस्टम पुराने तंत्र का उपयोग करने पर ऐसा कर सकते हैं।
नए कार्यक्रमों का उपयोग करना चाहिए fcntl(
... O_NONBLOCK
... )
, के रूप में POSIX द्वारा मानकीकृत।