2012-06-27 10 views
6

/dev/full पर लिखकर एक परीक्षण सूट में एक त्रुटि त्रुटि उत्पन्न करना आसान है। क्या पढ़ने की त्रुटि उत्पन्न करने के लिए कोई अच्छी तकनीक है? मैं वर्तमान में read ओवरराइड करने के लिए LD_PRELOAD का उपयोग कर रहा हूं लेकिन यह बहुत जटिल और गैर पोर्टेबल लगता है (नहीं कि/dev/full पोर्टेबल है ...)।एक पठन त्रुटि उत्पन्न करें

+0

बस एक विचार, लेकिन परमिट के साथ फ़ाइल से पढ़ने के बारे में क्या 000 सेट? –

+0

@ लोडमास्टर जो 'read' त्रुटि के बजाय' ओपन 'त्रुटि का कारण बनता है। –

+0

क्या आप EINVAL के बाद हैं? – jpe

उत्तर

5

एक निर्देशिका से पढ़ने (पिछले जवाब में उल्लेख किया) के अलावा आप /proc/self/mem को पढ़ने के लिए एक त्रुटि प्राप्त करने की कोशिश कर सकते हैं (यह आप लिनक्स पर एक EIO मिलना चाहिए)। एक स्पष्टीकरण के लिए, कृपया देखें: https://unix.stackexchange.com/a/6302

+0

अच्छी चाल है, लेकिन सावधान रहें कि '/ proc/self/mem' केवल तभी अच्छा है जब आप फ़ाइल की शुरुआत से पढ़ते हैं। यदि कार्यक्रम पहले खोजता है, तो यह गलती से मैप किए गए क्षेत्र में समाप्त हो सकता है। – Gilles

2

(ओएस एक्स) के अनुसार (2) मैनपेज के अनुसार, पढ़ें (2) एक त्रुटि उत्पन्न करेगा यदि "[ए] एन निर्देशिका को पढ़ने के लिए प्रयास किया जाता है।" इसलिए आप एक निर्देशिका खोल सकते हैं (2) एक निर्देशिका (सुनिश्चित करें कि प्रोट लेखन लिखने की अनुमति नहीं देता है, या यह एक त्रुटि फेंक देगा) और फिर इसे पढ़ने का प्रयास करें। ऐसा लगता है कि वहां सूचीबद्ध एकमात्र त्रुटि है जो 'सामान्य' परिस्थितियों में हो सकती है (यानि जानबूझकर फ़ाइल * स्ट्रक्चर तोड़ने जैसी कुछ करने के बिना)।

मुझे लगता है कि आप सी में कुछ (2) त्रुटियों या इस तरह की कुछ त्रुटियों के बारे में बात कर रहे हैं, लेकिन यहां तक ​​कि एक उच्च स्तरीय भाषा में भी, आप एक निर्देशिका खोलने और इसे पढ़ने की कोशिश कर सकते हैं (हालांकि मैंने अभी इसे पायथन के साथ करने की कोशिश की है, और यह आपको निर्देशिका खोलने के लिए बहुत स्मार्ट है ...)

1

आप एक अवैध सूचक को भी बफर के रूप में पढ़ सकते हैं, जो एक -AFAULT लौटाएगा। कुछ की तरह:

read(fd, (char *)0, cout); 

धन्यवाद सुजुकी

+0

वह एक पठन त्रुटि उत्पन्न नहीं करेगा (EINVAL), लेकिन एक बफर पढ़ने के दौरान आपके सुलभ पता स्थान (EFAULT) के बाहर है। लेकिन आदमी 2 के अनुसार पढ़ा गया है कि थोड़ा बदलाव के साथ EINVAL को प्राप्त करना संभव होना चाहिए। लेकिन सवाल यह है कि "कोड को संशोधित किए बिना EINVAL कैसे प्राप्त करें, लेकिन एक रैपर का उत्पादन करना जो सभी रोचक गलतियों की स्थिति का अनुकरण करेगा"। – jpe

+0

वास्तव में कोड को संशोधित नहीं किया जाना चाहिए और प्रक्रिया को फ़ाइल को सफलतापूर्वक खोलना चाहिए, एकाधिक I/O संचालन (दोनों पढ़ना और लिखना) करना चाहिए लेकिन फिर कुछ बाद के पढ़ने के लिए विफल होने के लिए किया जाना चाहिए। यह एक साधारण काउंटर को पढ़ने और कार्यान्वित करने के ओवरराइडिंग द्वारा किया जा सकता है ताकि एनएच रीड ऑपरेशन विफल हो जाए, लेकिन शेल स्क्रिप्ट से कुछ करना अच्छा होगा: 'kill -STOP $ pid; chmod 000 फ़ाइल; मारो -कंट $ पिड'।इसी तरह की स्थितियों में लिखने की त्रुटि प्राप्त करने का एक तरीका अच्छा होगा, क्योंकि लिखने के लिए/dev/full लिखना पहले लिखने में विफल रहता है। –

4

सभी प्रमुख इकाइयों पर काम करने वाला एक दृष्टिकोण एक छोटे से FUSE फाइल सिस्टम को लागू करना होगा। ईआईओ डिफ़ॉल्ट त्रुटि कोड है जब आपका उपयोगकर्ता स्पेस फाइल सिस्टम ड्राइवर कुछ गलत करता है, इसलिए इसे हासिल करना आसान है। Perl और Python बाइंडिंग दोनों शुरू करने के लिए उदाहरण के साथ आते हैं, आप जल्दी से एक फाइल सिस्टम लिख सकते हैं जो अधिकतर मौजूदा फाइलों को प्रतिबिंबित करता है लेकिन सावधानी से चुने गए स्थानों में ईआईओ इंजेक्ट करता है।

ऐसी मौजूदा फाइल सिस्टम है: petardfs (article), मुझे नहीं पता कि यह बॉक्स से कितनी अच्छी तरह से काम करता है।

+0

ओह, +1: petardfs स्पष्ट रूप से करने के लिए सही बात है। –

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