इसलिए मैंने यूनिक्स-स्ट्रीम सहायक डेटा के बारे में बहुत सारी जानकारी पढ़ी है, लेकिन सभी दस्तावेज़ों से एक चीज़ गायब है जब एक आंशिक रीड हो तो क्या होना चाहिए?
मान लीजिए कि मैं 24 बाइट बफर में निम्नलिखित संदेश प्राप्त कर रहा हूं
msg1 [20 byes] (no ancillary data)
msg2 [7 bytes] (2 file descriptors)
msg3 [7 bytes] (1 file descriptor)
msg4 [10 bytes] (no ancillary data)
msg5 [7 bytes] (5 file descriptors)
पहले कॉल करने के लिए, मुझे msg1 (और msg2 का हिस्सा? क्या ओएस कभी ऐसा करेगा?) अगर मुझे msg2 का हिस्सा मिलता है, तो क्या मुझे तुरंत डेटा मिल जाएगा, और इसे अगले पढ़ने के लिए सहेजने की आवश्यकता है। जब मुझे पता है कि संदेश वास्तव में मुझे डेटा के साथ क्या करने के लिए कह रहा था? यदि मैं msg1 से 20 बाइट्स मुक्त करता हूं और फिर से कॉल करता हूं, तो क्या वह कभी भी msg3 और msg4 को एक ही समय पर वितरित करेगा? क्या संदेश 3 और msg4 से सहायक डेटा नियंत्रण संदेश संरचना में संक्षिप्त हो जाता है?
जब मैं परीक्षण कार्यक्रमों को प्रयोगात्मक रूप से यह पता लगाने के लिए लिख सकता था, तो मैं प्रलेखन के बारे में देख रहा हूं कि सहायक डेटा स्ट्रीमिंग संदर्भ में कैसे व्यवहार करता है। यह अजीब लगता है कि मुझे इस पर कुछ भी आधिकारिक नहीं मिल रहा है।
मैं अपने प्रायोगिक निष्कर्ष यहाँ जोड़ने जा रहा हूँ, जो मुझे इस परीक्षण कार्यक्रम से मिला:
https://github.com/nrdvana/daemonproxy/blob/master/src/ancillary_test.c
लिनक्स 3.2.59, 3.17.6
ऐसा प्रतीत होता है कि लिनक्स अन्य संदेशों के अंत में सहायक-असर वाले संदेशों के कुछ हिस्सों को जोड़ देगा, जब तक कि इस कॉल के दौरान पुनरावृत्ति के लिए कोई पूर्व सहायक पेलोड देने की आवश्यकता न हो। एक बार एक संदेश के सहायक डेटा को वितरित किया जा रहा है, यह अगले सहायक डेटा संदेश को शुरू करने के बजाय एक छोटी रीडिंग लौटाएगा। इसलिए, ऊपर दिए गए उदाहरण में, मुझे जो लिखा हुआ मिलता है वह है:
recv1: [24 bytes] (msg1 + partial msg2 with msg2's 2 file descriptors)
recv2: [10 bytes] (remainder of msg2 + msg3 with msg3's 1 file descriptor)
recv3: [17 bytes] (msg4 + msg5 with msg5's 5 file descriptors)
recv4: [0 bytes]
बीएसडी 4.4, 10.0
बीएसडी लिनक्स की तुलना में अधिक संरेखण प्रदान करता है, और सहायक डेटा के साथ एक संदेश की शुरुआत से तुरंत पहले एक छोटी रीडिंग देता है । लेकिन, यह खुशी से एक सहायक-असर संदेश के अंत में एक गैर-सहायक-असर संदेश को जोड़ देगा। तो बीएसडी के लिए, ऐसा लगता है कि यदि आपका बफर सहायक-असर वाले संदेश से बड़ा है, तो आपको लगभग पैकेट जैसा व्यवहार मिलता है। मेरे द्वारा पढ़ी जाने वाली पुस्तकें हैं:
recv1: [20 bytes] (msg1)
recv2: [7 bytes] (msg2, with msg2's 2 file descriptors)
recv3: [17 bytes] (msg3, and msg4, with msg3's 1 file descriptor)
recv4: [7 bytes] (msg5 with 5 file descriptors)
recv5: [0 bytes]
करने के लिए:
अभी भी जानना चाहेंगे कि पुराने लिनक्स, आईओएस, सोलारिस, आदि पर यह कैसे होता है और भविष्य में ऐसा कैसे हो सकता है।