c - Why is data not being flushed to file on process exit? -
int main (int argc, char * argv []) {FILE * fp = fopen ("a.txt "," Wt "); Fprintf (एफपी, "एएएए"); // कोई फ्लश नहीं और कोई नज़दीकी बढ़ा नहीं (SIGTERM); निकास (EXIT_SUCCESS); } परिणाम: कोई डेटा a.txt में लिखा है मुझे उम्मीद है यह ठीक है। क्योंकि सिस्टम फाइल संभाल बंद कर देगा और फिर फाइल सिस्टम ड्रायवर अपने क्लोज हँडलर में अनलिखित डेटा को फ्लश करेगा। लेकिन यह नहीं था। मैंने इस कोड को EXT4, उबुंटू 11.10 पर परीक्षण किया
प्रश्न: मैंने सोचा था कि सभी फाइलसिस्टमों को अपने करीबी प्रसंस्करण पर अन्तर्हित डेटा को फ्लश करना चाहिए।
पॉज़िक्स के पास नियम नहीं है?
PS यह कोड NTFS, Win7 पर अच्छी तरह से काम करता है
int _tmain (int argc, _TCHAR * argv []) {हैंडल एच = बनाएँफ़ाइल (एल "डी: \\ a.txt") , GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0); BYTE a [3]; मेम्सेट (ए, 'ए', 3); DWORD dw; लिस्टफाइल (एच, (पीवीओआईडी) ए, 3, और डू, 0); टर्मिनेटप्रक्रिया (गेटक्र्यंटप्रक्रिया (), 1); वापसी 0; } संपादित करें:
मैंने सिस्टम कॉल लिखने के साथ फिर से इसका परीक्षण किया है। और यह अच्छी तरह से प्लावित था int main (int argc, char ** argv) {int fd = open ("a.txt", O_CREAT | O_TRUNC | O_WRONLY); चार बफ [3]; मेमेसेट (बफ़, 'ए', 3); Size_t परिणाम = लिखें (एफडी, बफ़, 3); (SIGTERM) जुटाने; निकास (EXIT_SUCCESS); वापसी 0; }
इसमें फ़ाइल सिस्टम ड्राइवरों के साथ कुछ भी नहीं है। मुद्दा यह है कि सीआरटी फ़ाइल स्ट्रीम ही बफरिंग कर रहा है आप setvbuf () के साथ बफर आकार सेट करते हैं, यदि आप इस फ़ंक्शन का उपयोग नहीं करते हैं तो यह डिफ़ॉल्ट का उपयोग करता है। जब आप WriteFile () का उपयोग करते हैं, तो अनुप्रयोग में कोई बफ़र नहीं होता है, तो ऑपरेटिंग सिस्टम की फ़ाइल सिस्टम कैश में आउटपुट बफ़र होता है। अचानक ऐप बंद होने से इम्यून।
आपको इसे प्राप्त करने के लिए फ्लावर () को कॉल करना होगा।
Comments
Post a Comment