2016-01-31 6 views
9

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

हालांकि, पहली बार लिखने के द्वारा बनाए गए छेद को शून्य से भर दिया जाता है और यदि छेद काफी बड़ा होता है, तो इस ऑपरेशन में कुछ समय लग सकता है। मेरे आवेदन में, इस शून्य प्रारंभिकता की कोई आवश्यकता नहीं है, क्योंकि छेद सटीक लंबाई का है और मैं इसे बाद में अपने डेटा से भर दूंगा।

seek के बाद कॉल को शून्य-भरने से रोकने के लिए कोई तरीका है (भले ही इसमें फाइल सिस्टम ड्राइवर को संशोधित करना शामिल हो)? वैकल्पिक रूप से, फ़ाइल की शुरुआत से पहले फ़ाइल में लिखने का एक तरीका है (फ़ाइल के सामने जोड़ना)?

उत्तर

6

यह संभवतः आपके फाइल सिस्टम से संबंधित है। Ext2/3/4, reiser, btrfs, xfs, और जैसा कि आप वर्णन करते हैं, लंबे समय तक लेना चाहिए, क्योंकि वे "स्पैस फाइल" कहलाते हैं (फाइलें जो अंतर्निहित में कम जगह लेती हैं) फ़ाइल के आकार की तुलना में भंडारण, क्योंकि शून्य के रन भौतिक रूप से संग्रहीत नहीं होते हैं)। अपने फाइल सिस्टम, कि शायद विफल रहता है पर

$ dd if=/dev/zero of=whatever bs=1k seek=1073741824 count=1 
1+0 records in 
1+0 records out 
1024 bytes (1.0 kB) copied, 9.1878e-05 s, 11.1 MB/s 
$ ls -al whatever 
-rw-r--r-- 1 xxxx xxxx 1099511628800 Jan 31 18:04 whatever 
$ du -h whatever 
16K whatever 

:

आप यकीन है कि यह मामला है बनाने के लिए dd के साथ एक प्रयोग की कोशिश हो सकती है। यदि ऐसा है, और आपको एक स्पैस फ़ाइल बनाने की आवश्यकता है, तो यह निर्धारित करें कि आप एक अलग फाइल सिस्टम का उपयोग कर सकते हैं या नहीं।

+0

आप सही हैं। मेरे मामले में, 'dd if =/dev/zero =/mnt/mmc/जो भी bs = 1k seek = 100000' चल रहा है लगभग 10 सेकंड लेता है, और परिणामस्वरूप फ़ाइल का आकार 97.7 एम है।फाइल सिस्टम vfat है, और दुर्भाग्यवश मैं इसे बदल नहीं सकता, क्योंकि मैं एक एसडी-कार्ड पर काम कर रहा हूं, जिसे कई प्रणालियों में पठनीय किया जाना चाहिए। –

+0

हां, एफएटी फाइल सिस्टम में से कोई भी किसी भी प्रकार के स्पैस फ़ाइल स्टोरेज का समर्थन नहीं करता है जिसे मैं जानता हूं। आप जो भी मांग रहे हैं उसे पाने का शायद कोई रास्ता नहीं है, लेकिन शायद उस वास्तविक समस्या का एक अच्छा समाधान है जिसे आप हल करने का प्रयास कर रहे हैं। –

+1

@NebojsaMrmak: इस [अन्य उत्तर] पर एक नज़र डालें (http://stackoverflow.com/a/4396912/865874), एचटीएच। – rodrigo

-1

क्या आपने ध्वज MAP_UNINITIALIZED का उपयोग करने का प्रयास किया है?

+1

लिंक किए गए मैन पेज के अनुसार, यह ध्वज केवल अज्ञात स्मृति के लिए उपलब्ध है, यह स्मृति है जो फ़ाइल से नहीं है। – rodrigo

1

हालांकि, पहली बार लिखने के द्वारा बनाए गए छेद को शून्य से भर दिया जाता है और यदि छेद काफी बड़ा होता है, तो इस ऑपरेशन में कुछ समय लग सकता है।

नहीं, यह नहीं कर सकता। यह आपके द्वारा प्रदत्त डेटा को केवल write() पर लिखा जाएगा। अनचाहे हिस्से में शून्य भौतिक रूप से वहां नहीं हैं: वे फ़ाइल सिस्टम का एक आर्टेफैक्ट हैं।

+0

आपकी टिप्पणी सच है, यह करता है यह नहीं कहें कि इस व्यवहार के आसपास कोई रास्ता है या नहीं? जो मैं खोज रहा हूं वह इस तथ्य के आसपास एक कामकाज है। –

+0

यदि मेरा * उत्तर * सत्य है, तो आसपास काम करने का कोई व्यवहार नहीं है। शून्य-बाइट लिखते हैं कि आप कल्पना कर रहे हैं कि वे काल्पनिक हैं। अन्यथा मेरा जवाब झूठा है। आप दोनों तरीकों से नहीं हो सकते हैं। – EJP

+1

गलत: सभी फाइल सिस्टम स्पैस फ़ाइलों का समर्थन नहीं करते हैं। ओपी vfat का उपयोग कर रहा है, जो निश्चित रूप से नहीं करता है। –

0

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

या इसे थोड़ा और जटिल बनाते हैं और परिवर्तनीय खंड आकार का उपयोग करते हैं, व्यक्तिगत संग्रह के "वर्चुअल" आकार के साथ कहीं और संग्रहीत किया जाता है। एक जटिल पर्याप्त संख्या प्रणाली को देखते हुए आप बाद में खंड फ़ाइलों को नामित किए बिना नए भाग भी डाल सकते हैं ...

बेशक आपको डी-चंकिंग करने के लिए अतिरिक्त एक्सेस लेयर की आवश्यकता होगी, या तो यह आपके आवेदन कोड में पर्याप्त है , या फाइल हैंडलिंग में कर्नेल ड्राइवर हुकिंग के रूप में सबसे खराब मामला।

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