সি প্রোগ্রামিং -এ POSIX ফাংশন পড়ুন

Posix Read Function C Programing



Traditionalতিহ্যবাহী POSIX সামঞ্জস্যপূর্ণ অপারেটিং সিস্টেমে, একটি ফাইল সিস্টেমে থাকা নথির তথ্য পেতে, একটি প্রোগ্রাম রিড সিস্টেম কল ব্যবহার করে। একটি নথির বর্ণনাকারী যা সাধারণত পূর্ববর্তী কল থেকে খুলতে অ্যাক্সেস করা হয় তা ফাইল দ্বারা সংজ্ঞায়িত করা হয়। এই পঠিত সিস্টেম কলটি বাইট এবং সেই পূর্ণসংখ্যা যা পাঠক নথি থেকে নির্দিষ্ট করে, এবং তারপর কলিং প্রক্রিয়া দ্বারা প্রদত্ত বাফারে এটি সংরক্ষণ করে।

ফাংশন সংজ্ঞা

আপনার কোডে রিড ফাংশন নির্ধারণ করার আগে, আপনাকে কিছু প্রয়োজনীয় প্যাকেজ অন্তর্ভুক্ত করতে হবে।







#অন্তর্ভুক্ত

এখানে আপনি কিভাবে POSIX রিড ফাংশন সংজ্ঞায়িত করেন:



>>ssize_t pread(intহাতির দাঁত,শূন্য *বুফ,size_tnbyte, off_t অফসেট);
>>ssize_t পড়া(intএফডি,শূন্য *বুফ,size_tnbytes);

পঠিত পদ্ধতির কল থেকে তিনটি প্যারামিটার আর্গুমেন্ট নেওয়া যেতে পারে:



int fd: যেখান থেকে তথ্য পড়তে হয় সেই ফাইলের ফাইলের বর্ণনাকারী। আমরা হয় একটি ওপেন সিস্টেম কলের মাধ্যমে অর্জিত একটি ফাইল বর্ণনাকারী ব্যবহার করতে পারি, অথবা আমরা যথাক্রমে সাধারণ ইনপুট, নিয়মিত আউটপুট বা নিয়মিত ত্রুটির উল্লেখ করে 0, 1, অথবা 2 ব্যবহার করতে পারি।





অকার্যকর *buf: বাফার বা অক্ষর অ্যারে যেখানে পড়া তথ্য সংরক্ষণ এবং সংরক্ষণ করা উচিত।

Size_t nbyte: কাটার আগে ডকুমেন্ট থেকে যেসব বাইট পড়া দরকার ছিল। সমস্ত তথ্য বাফারে সংরক্ষণ করা যেতে পারে যদি পড়া তথ্য nbytes এর চেয়ে ছোট হয়।



বর্ণনা

রিড () পদ্ধতিটি খোলা নথির বর্ণনাকারী 'ফিল্ডেস' বা 'এফডি' এর সাথে সংযুক্ত ফাইল থেকে 'বুফ' দ্বারা উল্লেখিত বাফার ক্যাশে 'এনবাইট' বাইট পড়ার চেষ্টা করে। এটি একই প্রবাহ, FIFO, বা টার্মিনাল ইউনিটে একযোগে একাধিক পাঠের প্রকৃতি সংজ্ঞায়িত করে না।

যেসব নথিতে পঠন সক্ষম হয়, তাদের নথির অফসেট থেকে পঠন প্রক্রিয়া শুরু হয় এবং পড়া বাইটের সংখ্যা দ্বারা অফসেট বৃদ্ধি পায়। যদি ডকুমেন্ট অফসেট ফাইলের প্রান্তে বা তার বাইরে থাকে, সেখানে কোন বাইট পড়া হয় না, এবং পড়া () কিছুই দেয় না।

যখন গণনা 0 হয়, পড়ুন () নীচে উল্লিখিত ত্রুটিগুলি সনাক্ত করবে। যদি কোন ভুল না হয়, অথবা যদি read () ত্রুটির জন্য হিসাব করা না হয়, একটি read () 0 এর গণনা সহ শূন্য উৎপন্ন করে এবং তাই অন্য কোন প্রতিক্রিয়া নেই।

POSIX.1 অনুযায়ী যদি গণনা SSIZE_MAX এর চেয়ে বেশি হয়, তাহলে ফলাফল বাস্তবায়নের মাধ্যমে নির্ধারিত হয়।

ফেরত মূল্য

কৃতিত্বের উপর প্রত্যাবর্তিত বাইটের সংখ্যা 'রিড' এবং 'প্রিড' অবশ্যই একটি অ-নেতিবাচক পূর্ণসংখ্যা হতে হবে যখন ফাইলের শেষে শূন্য পয়েন্ট থাকবে। এই নম্বরের দ্বারা নথির অবস্থান অগ্রসর হয়, অন্যথায়, একটি ত্রুটি বোঝাতে, পদ্ধতিগুলি ফিরে আসে -1 এবং 'ত্রুটি' বরাদ্দ করে। যখন এই পরিসংখ্যানটি অনুরোধ করা বাইটের সংখ্যার চেয়ে কম, তখন এটি একটি ভুল বাইট নয়। এটা সম্ভব হতে পারে যে আপাতত কম বাইট পাওয়া যায়।

ত্রুটি

এই ত্রুটিগুলি ঘটলে প্রিড এবং রিড ফাংশন ব্যর্থ হবে:

এগেইন:

দস্তাবেজ বা ফাইল বর্ণনাকারী 'fd' একটি নন-সকেট ফাইলের অন্তর্গত যাকে নন-ব্লকিং (O NONBLOCK) লেবেল করা হয়েছে এবং পড়া বন্ধ করবে।

EWOULDBLOCK:

বর্ণনাকারী 'fd' একটি সকেটের অন্তর্গত যাকে নন-ব্লকিং (O_NONBLOCK) লেবেল করা হয়েছে এবং পড়া বন্ধ করবে।

EBADF:

'Fd' ব্যবহারযোগ্য বর্ণনাকারী নাও হতে পারে, অথবা এটি পড়ার জন্য উন্মুক্ত নাও হতে পারে।

EFAULT:

এটি ঘটে যখন আপনার 'বুফ' আপনার নাগালের ঠিকানার বাইরে থাকে।

EINTR:

তথ্যের তথ্য পড়ার আগে, একটি সংকেত দ্বারা কলটি ভেঙে যেতে পারে।

নির্বাচন:

এই ত্রুটিটি ঘটে যখন আপনার 'fd' বর্ণনাকারী একটি বস্তুর সাথে জড়িত থাকে, যা পড়ার জন্য উপযুক্ত নয়, অথবা দস্তাবেজটি O_DIRECT পতাকা দিয়ে খোলা ছিল, এবং 'বুফ' এ বর্ণিত এক বা অন্য ঠিকানা, 'গণনায় নির্দেশিত মান ', অথবা ডকুমেন্ট অফসেট যথাযথভাবে যুক্ত নয়।

নির্বাচন:

টাইমারফিড_ক্রিয়েট (2) -এ একটি কল ব্যবহার করে বর্ণনাকারী 'এফডি' গঠিত হতে পারে, এবং ভুল আকারের বাফারটি পড়ার জন্য দেওয়া হয়েছে।

EIO:

এটি একটি ইনপুট/আউটপুট ত্রুটি। এটি ঘটে যখন ব্যাকগ্রাউন্ড প্রসেস গ্রুপ তার নিয়ন্ত্রক টার্মিনাল থেকে পড়ার চেষ্টা করে এবং এক বা অন্যটি SIGTTIN কে উপেক্ষা করে বা অবরুদ্ধ করে, অথবা তার প্রক্রিয়া গোষ্ঠীকে শোক করা হয়। এই ত্রুটির আরেকটি কারণ নিম্ন-স্তরের ইনপুট/আউটপুট ত্রুটি হতে পারে এদিকে একটি হার্ড ডিস্ক বা টেপ থেকে পড়া। নেটওয়ার্ক ডেটা ফাইলে EIO এর আরেকটি সম্ভাব্য কারণ হল ফাইল বর্ণনাকারীর উপদেশমূলক লকিং অপসারণ এবং সেই লকটির ব্যর্থতা।

EISDIR:

ফাইল বর্ণনাকারী 'fd' একটি ডিরেক্টরির অন্তর্গত।

মন্তব্য:

আরও অনেক ত্রুটি হতে পারে, বর্ণনাকারী 'fd' এর সাথে যুক্ত বস্তুর উপর নির্ভরশীল। উভয় size_t এবং ssize_t ফর্মগুলি চিহ্নহীন এবং POSIX.1 দ্বারা সংজ্ঞায়িত সংখ্যাসূচক ডেটা প্রকার চিহ্নিত। লিনাক্সে, সর্বাধিক 0x7ffff000 (2,147,479,552) বাইটগুলি রিডিং ফাংশন (এবং সমতুল্য সিস্টেম কল) দ্বারা প্রেরণ করা যেতে পারে, মূলত প্রেরিত বাইটের সংখ্যা ফিরিয়ে দেয় (32-বিট এবং 64-বিট উভয় প্ল্যাটফর্মে)। এনএফএস ফাইল সিস্টেমের সাথে, তথ্যের ক্ষুদ্র ধারা পড়ে টাইমস্ট্যাম্প পরিবর্তনের প্রথম মুহূর্তে, পরবর্তী কলগুলি তা করবে না। এটি ক্লায়েন্ট-সাইড অ্যাট্রিবিউট ক্যাশিংয়ের মাধ্যমে ট্রিগার করা হয়, যদিও সবগুলি নয়, NFS ক্লায়েন্ট st_atime (শেষ ফাইল অ্যাক্সেসের সময়) এর মাধ্যমে সার্ভারে আপডেট করা ছেড়ে দেয় এবং ক্লায়েন্টের বাফার থেকে ক্লায়েন্ট-সাইড রিডগুলি স্ট্রিটে পরিবর্তন ট্রিগার করবে না সার্ভারে এটাইম যেহেতু সার্ভার-সাইড রিডিং পাওয়া যায় না। ক্লায়েন্ট-সাইড অ্যাট্রিবিউট ক্যাশিং অপসারণ করে, ইউনিক্স মেটাডেটা অ্যাক্সেস করা যেতে পারে, কিন্তু এটি সার্ভারে লোড উল্লেখযোগ্যভাবে বৃদ্ধি করবে এবং বেশিরভাগ ক্ষেত্রে উৎপাদনশীলতাকে প্রভাবিত করবে।

উদাহরণ 01:

লিনাক্স সিস্টেমে রিড ফাংশন কল প্রদর্শন করার জন্য এখানে একটি সি প্রোগ্রাম রয়েছে। একটি নতুন ফাইলের মতো নিচের কমান্ডটি লিখুন। লাইব্রেরি যোগ করুন, এবং প্রধান ফাংশনে, একটি বর্ণনাকারী এবং আকার শুরু করুন। বর্ণনাকারী ফাইলটি খুলছে, এবং ফাইলের ডেটা পড়তে সাইজ ব্যবহার করা হয়।

উপরের কোডের আউটপুট নিচের ছবিতে দেখানো হবে।

উদাহরণ 02:

রিড ফাংশনের কাজ ব্যাখ্যা করার জন্য আরেকটি উদাহরণ নিচে দেওয়া হল।

আরেকটি ফাইল তৈরি করুন এবং নিচের কোডটি যেমন আছে সেখানে লিখুন। এখানে দুটি বর্ণনাকারী, fd1 এবং fd2, যে উভয়ের নিজস্ব খোলা টেবিল ফাইল অ্যাক্সেস আছে। তাই foobar.txt এর জন্য, প্রতিটি বর্ণনাকারীর ফাইলের অবস্থান রয়েছে। Foobar.txt এর প্রথম বাইটটি fd2 থেকে অনুবাদ করা হয়েছে এবং ফলাফল হল c = f, c = o নয়।

উপসংহার

আমরা দক্ষতার সাথে সি প্রোগ্রামিং -এ POSIX রিড ফাংশন পড়েছি। আশা করি, কোন সন্দেহ বাকি আছে।