2011-11-08 14 views
16

यह Is a successful send() "atomic"? पर एक फॉलोअप प्रश्न है, क्योंकि मुझे लगता है कि यह वास्तव में सामान्य रूप से सिस्टम कॉल से संबंधित है, न केवल सॉकेट पर भेजता है।सिस्टम कॉल कब और कैसे बाधित होते हैं?

कौन सी सिस्टम कॉल बाधित हो सकती है, और जब वे हैं, तो बाधा कहां है? मैंने SA_RESTART के बारे में सीखा है, लेकिन यह बिल्कुल समझ में नहीं आता कि क्या हो रहा है।

  • अगर मैं SA_RESTART बिना एक प्रणाली कॉल करते हैं, कॉल बीच में आता है किसी भी तरह का द्वारा बाधित किया जा सकता है (जैसे उपयोगकर्ता इनपुट) है कि अपने आवेदन चिंता का विषय नहीं है, लेकिन ओएस की आवश्यकता होती है मेरी कॉल गर्भपात और कुछ करने के लिए अन्य? या क्या यह सिग्नल द्वारा केवल बाधित है जो सीधे मेरी प्रक्रिया (CTRL + C, सॉकेट बंद, ...) से संबंधित है?

  • SA_RESTART सेट करते समय, प्रेषण() या किसी अन्य "धीमी" syscall के अर्थशास्त्र क्या हैं? क्या यह हमेशा तब तक अवरुद्ध होगा जब तक कि मेरा सभी डेटा प्रसारित नहीं हो जाता है या सॉकेट डाउन हो जाता है, या यह भेजने() के पैरामीटर में गिनती से छोटी संख्या के साथ वापस आ सकता है?

  • पुनरारंभ करना पुनरारंभ करना कहां है? क्या ओएस जानता है कि मैं किसी भी इंटरप्ट पर कॉल को पुनरारंभ करना चाहता हूं, या कुछ सिग्नल मेरी प्रक्रिया में भेजा गया है और फिर लाइब्रेरी कोड द्वारा संभाला गया है? या मुझे इसे खुद करना है, उदा। थोड़ी देर में कॉल को लपेटें और जितनी बार आवश्यक हो पुनः प्रयास करें?

उत्तर

9

सिस्टम कॉल किसी भी signal से बाधित किया जा सकता है, इस SIGINT (CTRL-C द्वारा उत्पन्न), SIGHUP, आदि के रूप में इस तरह के संकेत

जब SA_RESTART सेट किया गया है, एक send() वापस आ जाएगी (साथ शामिल भेजा गया गिनती) यदि सिग्नल प्राप्त होने से पहले कोई डेटा प्रसारित किया गया था, तो यह एक त्रुटि EINTR लौटाएगा यदि कोई प्रेषण समय निर्धारित किया गया था (जैसा कि उन्हें पुनरारंभ नहीं किया जा सकता है), अन्यथा send() पुनरारंभ किया जाएगा।

सिस्टम कॉल पुनरारंभ करना कर्नेल के सिग्नल हैंडलिंग कोड में लागू किया गया है। सिस्टम कॉल आंतरिक रूप से -ERESTARTSYS को लंबित सिग्नल का पता लगाने (या सिग्नल द्वारा बाधित प्रतीक्षा करने के बाद) लौटाता है, जिससे सिग्नल हैंडलिंग कोड कॉल पॉइंटर और प्रासंगिक रजिस्टरों को कॉल से पहले राज्य में बहाल करने का कारण बनता है, जिससे सिस्कल दोहराया जाता है।

+1

इसका मतलब केवल मेरी प्रक्रिया में भेजे गए संकेत हैं, है ना? मैंने किसी भी तरह से माना कि मेरे इंटरप्ट (एक कुंजी प्रेस, माउस चाल, टाइमर इंटरप्ट, ...) को संभालने वाले कर्नेल का कोई भी बाधा मेरे कॉल को वापस करने और सिग्नल भेजने के लिए कारण बन जाएगा। सिस्टम कॉल के दौरान एक संदर्भ स्विच समय के अलावा किसी भी तरह से मेरी प्रक्रिया में हस्तक्षेप नहीं करना चाहिए, है ना? – lxgr

+1

@lxgr, यह सही है, संदर्भ स्विचिंग सिस्टम कॉल को रोक नहीं देती है। –

संबंधित मुद्दे