क्या विशिष्ट सिस्टम कॉल इंटरफेस फ़ाइल के आकार को कम करने की अनुमति देता है (इसे एक अलग इनोड के साथ बदले बिना)?


9

वहाँ एक open()फ़ाइल के लिए एक रास्ता है और इसे हटना करने के लिए कारण? एक, निश्चित रूप से, उन्हें एपेंड-मोड में खोल सकते हैं या अंत में तलाश कर सकते हैं और उन्हें बढ़ने का कारण बना सकते हैं। हालाँकि, जहाँ तक मुझे पता है, किसी फाइल को विशिष्ट यूनिक्स-शैली प्रणाली कॉल इंटरफेस के माध्यम से सिकोड़ने की कोई विधि नहीं है।

ऐसा करने का एकमात्र तरीका, जहाँ तक मुझे पता है, एक नई छोटी फ़ाइल बनाकर और rename()पुराने के स्थान पर इसे फेक कर है।

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

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


2
बस fopenमोड "डब्ल्यू" (या "डब्ल्यू +") के साथ एक फ़ाइल खोलने से यह स्वचालित रूप से शून्य लंबाई तक छोटा हो जाएगा। या क्या आप पुरानी सामग्री को संरक्षित करने के लिए गैर-शून्य आकार में सिकुड़ने का मतलब है?
वायजार्ड

4
बस FYI करें, open()और openat()पहले से ही ट्रंकटिंग के लिए एक ध्वज है, O_TRUNCइसलिए तकनीकी रूप से यह फ़ाइल को सिकोड़ने का कारण बनता है - अर्थात, पूरी तरह से हटना - इनोड को बदले बिना। इसका सबसे प्रसिद्ध उदाहरण है command > file.txt, जहां मौजूद होने पर फ़ाइल को छोटा कर दिया जाएगा। आप चलाते हैं straceपर bash -c 'true > /dev/null'आप देखेंगे openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)उत्पादन में। ट्रंकेशन के चर आकार के लिए बेशक आपको truncate()syscall की आवश्यकता है । अगर आप इसे टिप्पणी के बजाय एक वास्तविक उत्तर के रूप में चाहते हैं तो मुझे बताएं।
सर्गी कोलोडाज़नी

@SergiyKolodyazhnyy मैं मनमाने आकार में सिकुड़ने की सोच रहा था। मैंने डेविड फ़ॉस्टर के उत्तर को रद्द कर दिया है क्योंकि यह प्रश्न का सबसेट उत्तर देता है, लेकिन मैं इसे इकारस के प्रकाश में स्वीकार नहीं कर रहा हूं। मैंने इसे हाँ-और-नो प्रकार के उत्तर के रूप में लिया होगा, जबकि इकारस के जवाब से पहले ही पता चला था कि असली उत्तर "हाँ" है।
जोएल

जवाबों:


22

man -s 2 ftruncate कहते हैं

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

यह कहा जाता है कि यदि आप ftruncate का उपयोग करते हैं, तो आपने फ़ाइल को लिखने के लिए खोल दिया होगा, और यदि आप truncate का उपयोग करते हैं तो फ़ाइल को लिखने योग्य होना चाहिए।


एक फ़ाइल पर लागू होने के कारण OS पहले truncateइसे नए फ़ाइल आकार के लिए समायोजित करता है, और फिर write इसे। तो truncateसिस्टम कॉल आप के लिए देख रहे हैं।
मर्गिसिसेया

1
लिनक्स पर, यह भी देखेंfallocate(FALLOC_FL_COLLAPSE_RANGE)
स्टीफन चेज़लस

2

open(2)सिस्टम कॉल को स्वीकार करता है O_TRUNCझंडा कि फ़ाइल का आकार कम कर सकते हैं:

O_TRUNC- यदि फ़ाइल मौजूद है और एक नियमित फ़ाइल है, और फ़ाइल सफलतापूर्वक खुल गई है O_RDWRया O_WRONLY, इसकी लंबाई 0 से कम हो जाएगी, और मोड और स्वामी अपरिवर्तित होंगे। इसका FIFO विशेष फ़ाइलों या टर्मिनल डिवाइस फ़ाइलों पर कोई प्रभाव नहीं पड़ेगा। अन्य फ़ाइल प्रकारों पर इसका प्रभाव कार्यान्वयन-परिभाषित है। या O_TRUNCतो बिना उपयोग के परिणाम अपरिभाषित हैं।O_RDWRO_WRONLY

जब प्रोग्राम पूरी तरह से फ़ाइल की सामग्री को अधिलेखित करने का लक्ष्य रखता है, तो इसका अक्सर उपयोग किया जाता है। एक उदाहरण आपके शेल की फ़ाइल पुनर्निर्देशन ऑपरेटर के रूप में है command > file

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.