2012-03-07 6 views
24

मेरे लिनक्स बॉक्स पर, sig_atomic_t एक सादा पुराना int है। क्या ints पर एक विशेष परमाणु गुणवत्ता है?लिनक्स: क्यों sig_atomic_t intped करने के लिए टाइप किया गया है?

$ gcc -v 
Using built-in specs. 
Target: x86_64-linux-gnu 
... 
Thread model: posix 
gcc version 4.3.2 (Debian 4.3.2-1.1) 

$ echo '#include <signal.h>' | gcc -E - | grep atomic 
typedef int __sig_atomic_t; 
typedef __sig_atomic_t sig_atomic_t; 
+0

@chrisaycock: सी? क्या यह किसी भी भाषा को 'sig_atomic_t' चरों तक पहुंच के साथ लागू नहीं करेगा? मैं आसानी से 'g ++' का उपयोग कर सकता था। – smcdow

+4

'sig_atomic_t' प्रकार वास्तव में सी विनिर्देश का हिस्सा है। यह सी ++ विनिर्देश में भी पाया जाता है (जैसा कि ज्यादातर चीजें हैं), लेकिन आपको सी टैग के साथ अच्छे जवाब मिलेंगे। –

+2

सी इसकी गारंटी नहीं देता है। विशिष्ट CPUs में कुछ प्रकार की परमाणुता के लिए विशिष्ट गारंटी होती है। विशेष रूप से, डेस्कटॉप सिस्टम में उपयोग किए जाने वाले आधुनिक सीपीयू कम से कम गठबंधन 'int' (यानी प्लेटफ़ॉर्म-शब्द-आकार वाले डेटा) के लिए परमाणुता की गारंटी देते हैं। यह पुराने CPUs के लिए, या एम्बेडेड सिस्टम में उपयोग किए गए CPUs के लिए मामूली रूप से मामला नहीं है। – ninjalj

उत्तर

33

C99 sig_atomic_t केवल "atomicity" का एक बहुत कमजोर परिभाषा के अनुरूप है, क्योंकि C99 संगामिति की कोई अवधारणा, केवल interruptibility है। (C2011 संगामिति मॉडल कहते हैं, और इसके साथ _Atomic प्रकार है कि मजबूत गारंटी है, लेकिन, AFAIK sig_atomic_t, अपरिवर्तित है के बाद से अपने किशमिश अभी भी संकेत संचालकों के साथ संचार होता है, धागे भर में नहीं।)

यह सब कुछ C99 कहते है के बारे में sig_atomic_t:

(§7.14 <signal.h>, पैरा 2) प्रकार परिभाषित sig_atomic_t, जो है (संभवतः अस्थिर योग्य) एक वस्तु है कि एक परमाणु इकाई के रूप में पहुँचा जा सकता है की पूर्णांक प्रकार है, असीमित इंटरप्ट की उपस्थिति में भी। (§7.14 <signal.h>, पैरा 2)

(§7.14p5) यदि [एक] संकेत abort या raise फ़ंक्शन कॉल के परिणाम के रूप के अलावा अन्य होता है, व्यवहार अपरिभाषित यदि संकेत हैंडलर स्थिर साथ किसी भी वस्तु को संदर्भित करता है volatile sig_atomic_t के रूप में घोषित ऑब्जेक्ट को मान निर्दिष्ट करने के अलावा अन्य संग्रहण अवधि।

तो sig_atomic_t (7.14 देखें) एक हस्ताक्षरित पूर्णांक प्रकार के रूप में परिभाषित किया गया है (§7.18.3 अन्य पूर्णांक प्रकार, पैरा 3 की सीमाएं), SIG_ATOMIC_MIN का मूल्य नहीं -127 से अधिक होगी और SIG_ATOMIC_MAX का मूल्य होगी 127 से कम नहीं; अन्यथा, sig_atomic_t एक अहस्ताक्षरित पूर्णांक प्रकार के रूप में परिभाषित किया गया है, और SIG_ATOMIC_MIN का मान 0 होगा और SIG_ATOMIC_MAX का मूल्य होगी कोई कम से कम 255.

शब्द "परमाणु इकाई" कहीं भी मानक में निर्धारित नहीं है । मानकों से अनुवाद, ese, इरादा यह है कि सीपीयू एक मशीन निर्देश के साथ स्मृति ("स्थिर भंडारण अवधि") में sig_atomic_t प्रकार के चर को पूरी तरह अद्यतन कर सकता है। इस प्रकार, समेकन मुक्त, सटीक अंतःक्रियात्मक सी 99 सार मशीन में, सिग्नल हैंडलर के लिए sig_atomic_tअद्यतन के माध्यम से अद्यतन के माध्यम से आधे रास्ते का निरीक्षण करना असंभव है। §7.18।यदि आवश्यक हो तो 3 एमपी भाषा लाइसेंस इस प्रकार char जितना छोटा हो। नोट क्रॉस प्रोसेसर स्थिरता से संबंधित किसी भी भाषा के पूर्ण अनुपस्थिति कृपया ध्यान दें।

वास्तविक CPUs हैं जिन्हें स्मृति के लिए char से अधिक मान लिखने के लिए एक से अधिक निर्देशों की आवश्यकता होती है। वास्तविक CPUs भी हैं जिन्हें मान शब्द (अक्सर, लेकिन आवश्यक नहीं है, int) स्मृति से स्मृति के लिए एक से अधिक निर्देशों की आवश्यकता होती है। जीएनयू सी लाइब्रेरी मैनुअल में भाषा अब गलत है। यह मूल लेखकों के हिस्से पर एक इच्छा का प्रतिनिधित्व करता है जो उन्होंने सी कार्यान्वयन के लिए अनावश्यक लाइसेंस के रूप में देखा जो अजीब छल करने के लिए किया गया है जिससे एप्लिकेशन प्रोग्रामर के लिए जीवन कठिन हो गया है। दुर्भाग्यवश, वह लाइसेंस है जो कुछ वास्तविक मशीनों पर सी को संभव बनाता है। कम से कम एक एम्बेडेड लिनक्स पोर्ट (एवीआर में) है जिसके लिए न तो int और न ही पॉइंटर्स को एक निर्देश में स्मृति में लिखा जा सकता है। (लोग मैन्युअल को अधिक सटीक बनाने पर काम कर रहे हैं, उदाहरण के लिए http://sourceware.org/ml/libc-alpha/2012-02/msg00651.html - sig_atomic_t उसमें याद किया गया है, हालांकि।

+1

क्या ग्लिब के पास एवीआर पोर्ट है? – ninjalj

+1

हे, ऐसा नहीं लगता है। यह शायद कुछ छोटे से बेहतर होगा :) हालांकि, मुझे लगता है कि लिनक्स/एवीआर जो भी सी पुस्तकालय है, वह हर्ड या अन्य बुटीक-लेकिन-एम्बेडेड ओएसई की तुलना में आजकल प्रासंगिक पोर्टेबिलिटी लक्ष्य होने की संभावना नहीं है। – zwol

+0

ठीक है, तो मुझे लगता है कि glibc मैनुअल गलत नहीं है। (ध्यान दें कि यह कहता है: _ अभ्यास_ और _ उन सभी मशीनों पर सत्य हैं जो जीएनयू सी लाइब्रेरी का समर्थन करता है _) – ninjalj

7

कुछ प्रकारों को पढ़ने/लिखने के लिए कई निर्देशों की आवश्यकता हो सकती है। int प्रकार हमेशा परमाणु रूप से पढ़ा/लिखा जाता है।

डेटा प्रकार: sig_atomic_t

यह एक पूर्णांक डेटा प्रकार है। इस प्रकार के ऑब्जेक्ट्स को हमेशा परमाणु रूप से एक्सेस किया जाता है।

प्रैक्टिस में, आप मान सकते हैं कि int और अन्य पूर्णांक प्रकार अब परमाणु हैं। आप यह भी मान सकते हैं कि सूचक प्रकार परमाणु हैं; यह बहुत सुविधाजनक है। ये दोनों मशीनों पर सत्य हैं जो जीएनयू सी लाइब्रेरी का समर्थन करता है, और सभी POSIX सिस्टम पर हम जानते हैं।

Reference

+8

यह * आमतौर पर * मामला है कि 'int' हमेशा पर पढ़ा जाता है और परमाणु रूप से लिखा जाता है। सी मानक विशेष रूप से इसकी गारंटी नहीं देता है। 'Int' के रूप में 'sig_atomic_t' को परिभाषित करके कार्यान्वयन, वादा करता है कि उस कार्यान्वयन के लिए यह मामला * है। आपको यह नहीं मानना ​​चाहिए कि यह सभी कार्यान्वयन के लिए सच है। –

+0

एक और वर्तमान [संदर्भ] (http://www.gnu.org/software/libc/manual/html_mono/libc.html#Atomic-Data-Access)। बस स्पष्ट करने के लिए, यह केवल जीएनयू सी पुस्तकालय पर लागू होता है? जीसीसी के साथ या उसके बिना? मैंने मानक सी में परमाणु पहुंच वाले सामान्य प्रकार के बारे में कभी नहीं सुना है (सामान्य परमाणु तरीकों को छोड़कर और लॉकिंग तंत्र को छोड़कर)। – Ioan

+0

@Ioan C99 में कोई समरूपता मॉडल नहीं है, इसलिए "परमाणु" का अर्थ क्या है जो आप शायद सोच रहे हैं उससे तुलना में बहुत कमजोर है। मेरा जवाब देखें संक्षिप्त उत्तर के लिए – zwol

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