Amd64 লিনাক্সে সি, 36 বাইট (কেবলমাত্র টাইমস্ট্যাম্প), 52 49 বাইট (আসল ডিস্ক ক্রিয়াকলাপ)
আমি open(2)পতাকাগুলি হার্ড-কোড করি , সুতরাং এটি অন্যান্য এবিআইতে পোর্টেবল নয়। অন্যান্য প্ল্যাটফর্মের লিনাক্স সম্ভবত একই ব্যবহার করে O_TRUNC, ইত্যাদি। তবে অন্যান্য পসিক্স ওএস নাও পারে।
+4 বাইটমালিকের লেখার অ্যাক্সেসের মাধ্যমে ফাইলটি তৈরি করা হয়েছে তা নিশ্চিত করার জন্য একটি সঠিক অনুমতি টিপে পাস করতে , নীচে দেখুন। (এটি জিসিসি 5.2 এর সাথে কাজ করার জন্য ঘটে)
কিছুটা পোর্টেবল এএনএসআই সি, 38/51 বাইট (কেবল টাইমস্ট্যাম্প), 52/67 বাইট (আসল ডিস্ক ক্রিয়াকলাপ)
@ জেনসের টিপ সহ @ ক্যাট এর উত্তরের ভিত্তিতে।
প্রথম সংখ্যাটি বাস্তবায়নের জন্য যেখানে একটির ফেরতের মান intরাখতে FILE *fopen()পারে, দ্বিতীয়টি যদি আমরা এটি করতে না পারি। লিনাক্সে, হিপ অ্যাড্রেসগুলি কম জায়গার মধ্যে অ্যাড্রেস স্পেসের 32 বিট থাকে, তাই এটি ছাড়াই -m32বা না করেও কাজ করে -mx32। (ঘোষণার void*fopen();চেয়ে খাটো #include <stdio.h>)
টাইমস্ট্যাম্প মেটাডেটা কেবলমাত্র I / O :
main(){for(;;)close(open("a",577));} // Linux x86-64
//void*fopen(); // compile with -m32 or -mx32 or whatever, so an int holds a pointer.
main(){for(;;)fclose(fopen("a","w"));}
বাইট লেখা, লিনাক্স ৪.২.০ + এক্সএফএস + এ আসলে ডিস্কটি চাপছে lazytime:
main(){for(;write(open("a",577),"",1);close(3));}
writeহ'ল লুপ শর্তটি, যা ঠিক থাকে কারণ এটি সর্বদা 1 প্রদান করে closeis
// semi-portable: storing a FILE* in an int. Works on many systems
main(f){for(;f=fopen("a","w");fclose(f))fputc(0,f);} // 52 bytes
// Should be highly portable, except to systems that require prototypes for all functions.
void*f,*fopen();main(){for(;f=fopen("a","w");fclose(f))fputc(0,f);} // 67 bytes
নন-পোর্টেবল সংস্করণটির ব্যাখ্যা:
ফাইলটি এলোমেলো আবর্জনা অনুমতি নিয়ে তৈরি করা হয়েছে। সঙ্গে gcc5.2 সঙ্গে -O0বা -O3, তবে এটাই হল মালিকের লেখার অনুমতি অন্তর্ভুক্ত করা হবে, কিন্তু এই নিশ্চিত নয়। 0666দশমিক 438 A তৃতীয় আর্গুমেন্টে openআরও 4 বাইট লাগবে । আমরা ইতিমধ্যে O_TRUNC এবং আরও হার্ড-কোডিং করছি, তবে এটি একই এবিআইতে একটি পৃথক সংকলক বা libc সহ ভেঙে যেতে পারে।
আমরা ২ য় তর্কটি বাদ দিতে পারি না open, কারণ আবর্জনার মানটি অন্তর্ভুক্ত হয় O_EXCLএবং O_TRUNC|O_APPENDতাই খোলাখুলি ব্যর্থ হয় EINVAL।
আমাদের থেকে রিটার্ন মান সংরক্ষণ করার দরকার নেই open()। আমরা এটি ধরে নিই 3, কারণ এটি সর্বদা থাকবে। এমনকি যদি আমরা fd 3 খোলা দিয়ে শুরু করি তবে এটি প্রথম পুনরাবৃত্তির পরে বন্ধ হয়ে যাবে। সবচেয়ে খারাপ ক্ষেত্রে, open3 টি শেষ অবধি উপলব্ধ ফাইল বর্ণনাকারী পর্যন্ত নতুন এফডিএস খুলতে থাকে। সুতরাং, প্রথম 65531 অবধি write()কলগুলি ব্যর্থ হতে পারে EBADFতবে তারপরে প্রতিটি openতৈরি fd = 3 দিয়ে স্বাভাবিকভাবে কাজ করবে ।
577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCx86-64 লিনাক্সে। ছাড়া O_TRUNC, ইনোড মোড সময় এবং পরিবর্তনের সময় আপডেট হয় না, তাই একটি ছোট আরগ সম্ভব হয় না। O_TRUNCসংস্করণটির জন্য এখনও প্রয়োজনীয় writeযা প্রকৃত ডিস্ক ক্রিয়াকলাপ উত্পাদন করতে কল করে, জায়গায় পুনর্লিখন নয়।
আমি কিছু উত্তর দেখুন যে open("a",1)। aইতিমধ্যে বিদ্যমান না থাকলে O_CREAT প্রয়োজন required O_CREATলিনাক্সে অষ্টাল 0100 (64, 0x40) হিসাবে সংজ্ঞায়িত করা হয়েছে।
কোনও রিসোর্স ফাঁস হয় না, তাই এটি চিরকাল চলতে পারে। straceআউটপুট:
open("a", O_WRONLY|O_CREAT|O_TRUNC, 03777762713526650) = 3
close(3) = 0
... repeating
অথবা
open("a", O_WRONLY|O_CREAT|O_TRUNC, 01) = 3
write(3, "\0", 1) = 1 # This is the terminating 0 byte in the empty string we pass to write(2)
close(3) = 0
আমি আমার সি ++ সংস্করণ openব্যবহার strace -eraw=openকরে এই এবিআইয়ের পতাকাগুলির দশমিক মান পেয়েছি ।
লিনাক্স lazytimeমাউন্ট অপশনটি সক্ষম করা ফাইল সিস্টেমে , কেবলমাত্র ইনড টাইমস্ট্যাম্পগুলিকে প্রভাবিত করে এমন একটি পরিবর্তন 24 ঘন্টা প্রতি কেবল একটি লেখার কারণ হতে পারে। সেই মাউন্ট বিকল্পটি অক্ষম থাকায়, টাইমস্ট্যাম্প আপডেট করা আপনার এসএসডি পরিধান করার একটি কার্যকর উপায় হতে পারে। (তবে অন্যান্য বেশ কয়েকটি উত্তর কেবল মেটাডেটা I / O করে)।
বিকল্প:
খাটো অ-কর্মরত :
main(){for(;;)close(write(open("a",577),"",3));}বন্ধ writeকরার জন্য একটি 3আরগ পাস করতে ফেরতের মান ব্যবহার করে । এটি অন্য বাইট সংরক্ষণ করে, তবে জিডিসি -O0 বা -O3 এ এমডি 64 এ কাজ করে না। 3 য় আর্গ এর আবর্জনা openআলাদা এবং এতে লেখার অনুমতি অন্তর্ভুক্ত নয়। aপ্রথমবার তৈরি হয়েছিল, তবে ভবিষ্যতের পুনরাবৃত্তিগুলি সমস্ত ব্যর্থ হয় -EACCESS।
দীর্ঘস্থায়ী, বিভিন্ন সিস্টেম কল সহ :
main(c){for(open("a",65);pwrite(3,"",1);)sync();} জায়গায় জায়গায় বাইট পুনর্লিখন এবং কল sync() সমস্ত ফাইল সিস্টেম সিস্টেম-সংযোগের জন্য করে। এটি ড্রাইভটি আলোকিত রাখে।
কোন বাইটটি আমাদের খেয়াল নেই, সুতরাং আমরা চতুর্থ আরগটি কবিতায় পাস করি না। বিরল ফাইলগুলির জন্য হ্যাঁ:
$ ll -s a
300K -rwx-wx--- 1 peter peter 128T May 15 11:43 a
আমার অনুমান ~ 128TiB এর অফসেটে একটি বাইট লেখার ফলে এক্সএফএস 30000 বিবি স্পেস ব্যবহার করে সীমার মানচিত্রটি ধরে রাখতে পারে, আমার ধারণা। এইচএফএস +: আইআইআরসি, এইচএফএস + সহ ওএস এক্স এ চেষ্টা করবেন না, সুতরাং এটি ডিস্কটি পূরণ করবে।
এক্সএফএস হ'ল একটি যথাযথ bit৪ বিট ফাইল সিস্টেম, 8 টি এক্সপাইট পর্যন্ত স্বতন্ত্র ফাইলগুলিকে সমর্থন করে । অর্থাৎ 2 ^ 63-1, সর্বোচ্চ মান off_tধরে রাখতে পারে।
strace আউটপুট:
open("a", O_WRONLY|O_CREAT, 03777711166007270) = 3
pwrite(3, "\0", 1, 139989929353760) = 1
sync() = 0
pwrite(3, "\0", 1, 139989929380071) = 1
sync() = 0
...
/dev/null? (yes>/dev/nullবৈধ বাশের উত্তর কি?)