2008-09-25 14 views
8

यह कोड है:पढ़ रहा है/dev/urandom थ्रेड-सुरक्षित है?

 
    unsigned int number; 
    FILE* urandom = fopen("/dev/urandom", "r"); 
    if (urandom) { 
    size_t bytes_read = fread(&number, 1, sizeof(number), urandom); 
    DCHECK(bytes_read == sizeof(number)); 
    fclose(urandom); 
    } else { 
    NOTREACHED(); 
    } 

यदि नहीं, तो मैं इसे थ्रेड-सुरक्षित कैसे बना सकता हूं?

उत्तर

10

जब तक समारोह के प्रत्येक निष्पादन अपनी ही धागे में है (यानी, स्थानीय चर number, urandom, bytes_read धागे के बीच साझा नहीं कर रहे हैं), मैं किसी भी धागे की सुरक्षा समस्याओं दिखाई नहीं देता। प्रत्येक थ्रेड के पास /dev/urandom में अपना स्वयं का फ़ाइल डिस्क्रिप्टर होगा। /dev/urandom कई प्रक्रियाओं से एक साथ खोला जा सकता है, ताकि ठीक है।

वैसे, /dev/urandom खोलने के लिए असफल हो सकता है, और अपने कोड इसके साथ सौदा करना चाहिए। कुछ कारण हैं: उपलब्ध फ़ाइल डिस्क्रिप्टर से बाहर चलना; /dev नहीं ठीक से घुड़सवार (हालांकि इस मामले में आप बड़ी समस्याओं है); अपने कार्यक्रम के एक विशेष chroot जो किसी भी उपकरणों के लिए उपयोग से इनकार करते हैं में चलाया जा रहा है; आदि

+0

जाहिर है यह, यह सुरक्षित है विवेक की खातिर चाहिए, लेकिन मैं आदमी 4 यादृच्छिक कि निर्दिष्ट करता है कि में कुछ भी नहीं मिल सकता है। उदाहरण के लिए यदि यूरेनैंड पीआरएनजी मोड में वापस आ गया है, तो क्या दो एक साथ कॉलर कभी भी मौके के अलावा एक ही आउटपुट देख सकते हैं? निश्चित रूप से नहीं, लेकिन दस्तावेज़ कहां नहीं कहते हैं? –

+0

"एक ही उत्पादन देखकर" "यादृच्छिक" का एक विशेष मामला है। :-) –

+0

@SteveJessop: प्रलेखन कि इंटरफ़ेस काम करता है कहने के लिए की जरूरत नहीं है। इसके अलावा, urandom केवल एक मोड है। –

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