কেন নিয়মিত বাফারে 4K বাইট ছেড়ে যায়?


30

আমি মূলত নিম্নলিখিত কোড আছে:

int fileWrite(int file, void * pBuffer, size_t size)
{
    size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
    if (bytesWritten != size)
    {
       return -1;
    }
    return 0;
}

এটি যদি আকারটি 1 গিগাবাইট হয় তবে এটি কাজ করে, তবে যখন আকারটি 2 গিগাবাইট হয় তখন এটি 4K বাইট ধারাবাহিকভাবে ছেড়ে যায়। আমি একটি লুপে লিখিত মোড়ানো এবং বাফারটিকে সরিয়ে দিয়ে এটি ঠিক করতে পারি তবে কেন এটি সর্বদা ব্যর্থ হয় তা সম্পর্কে আমি আগ্রহী।

উদাহরণস্বরূপ যদি আকার 2147483648 হয়, কেবল লেখ লিখুন 2147479552, 4096 অলিখিত লিখে রেখে। কেন এটি হবে এবং সর্বদা একটি লুপে লেখার মোড়কটি সঠিক?


2
আপনি কি এটি 32-বিট মোডে চালাচ্ছেন? 2 জিগ হ'ল সর্বোচ্চ 32-বিট নম্বর।
বার্মার

2
writeএকসাথে কতটা ডেটা গ্রাহ্য হবে তার নিয়মগুলি নির্ভর করে কী ধরণের ডেটা সিঙ্কের উপর নির্ভর করে file(যেমন "নিয়মিত" ফাইল, পাইপ, স্ট্রিম সকেট, ডেটাগ্রাম সকেট, ...)। আপনি আরো নির্দিষ্ট হতে পারে?
zwol

7
অপেক্ষা করুন, আপনি কি writeএকবারে পুরো ফাইলটি চেষ্টা করছেন ? সাধারণ পদ্ধতির মধ্যে হ'ল আপনি সবকিছু না লিখে অবধি একসময় ডেটা একটি বাফার-সাইজ স্ট্রিম করা।
লুয়ান

4
@ লুয়ান যদি আপনার কাছে ইতিমধ্যে সমস্ত ডেটা থাকে তবে আমি দেখতে পাচ্ছি না যে এটি একবারে লিখতে কিছু ভুল হয়েছে তবে এই প্রশ্নোত্তরটি যেমন বর্ণনা করে, write()এটি সমস্ত লিখতে হবে না (যা ছোট বাফারদের পক্ষেও যায়)
পাইপ

8
"আমি একটি লুপে লিখিত মোড়ানো দ্বারা এটি ঠিক করতে পারি" এবং SSIZE_MAXসীমাবদ্ধতা নির্বিশেষে আপনার প্রয়োজন । write()বৈশিষ্ট এটি সম্পূর্ণ বাফার লিখতে কোন বাধ্যবাধকতা অধীনে, এমনকি যদি এটা প্রায় সবসময় আছে বলেছেন। প্রশ্নে লুপ-কম কোডটি একটি বাগ।
আদম

উত্তর:


50

আপনি উত্তর খুঁজে পেতে পারেন man 2 write:

এই সংখ্যাটি অনুরোধ করা বাইটের সংখ্যার চেয়ে কম হলে এটি ত্রুটি নয়; এটি উদাহরণস্বরূপ ঘটতে পারে কারণ ডিস্ক ডিভাইস ভরাট ছিল।


এবং write()ম্যান পৃষ্ঠা বর্ণনা থেকে:

ssize_t write(int fd, const void *buf, size_t count);

পসআইএক্স .১ অনুসারে, এর countচেয়ে বেশি SSIZE_MAXহলে ফলাফলটি বাস্তবায়ন-সংজ্ঞায়িত; লিনাক্সের উপরের সীমাটির জন্য নোটগুলি দেখুন।

মন্তব্য

লিনাক্সে, write()(এবং অনুরূপ সিস্টেম কলগুলি) সর্বাধিক 0x7ffff000(2,147,479,552) বাইট স্থানান্তর করবে , বাস্তবে স্থানান্তরিত বাইটের সংখ্যা ফিরে আসবে। (এটি 32-বিট এবং 64-বিট উভয় সিস্টেমে সত্য)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.