ম্যান পৃষ্ঠাগুলি read()
এবং write()
কলগুলিতে পড়া থেকে দেখা যাচ্ছে যে এই কলগুলি ব্লক করতে হবে কিনা তা নির্বিশেষে সংকেত দ্বারা বাধাগ্রস্থ হয়।
বিশেষত, ধরে নিই
- একটি প্রক্রিয়া কিছু সংকেতের জন্য একটি হ্যান্ডলার স্থাপন করে।
- একটি ডিভাইস দিয়ে খোলা হয় (বলুন, একটি টার্মিনাল)
O_NONBLOCK
না সেট (অর্থাত মোড ব্লকিংয়ের অপারেটিং) - প্রক্রিয়াটি তখন
read()
ডিভাইস থেকে পড়তে সিস্টেম কল করে এবং ফলস্বরূপ কার্নেল-স্পেসে কার্নেল নিয়ন্ত্রণের পথটি কার্যকর করে। - প্র্যাক্সেসটি
read()
কার্নেল-স্পেসে এটি সম্পাদন করার সময় , হ্যান্ডলারটি আগে ইনস্টল করা হয়েছিল এমন সিগন্যালটি সেই প্রক্রিয়াতে সরবরাহ করা হয় এবং এর সংকেত হ্যান্ডলারটি অনুরোধ করা হয়।
ম্যান পেজগুলি এবং SUSv3 'সিস্টেম ইন্টারফেস ভলিউম (এক্সএসএইচ)' এর উপযুক্ত বিভাগগুলি পড়লে দেখা যায় যে:
আমি। read()
কোনও তথ্য পড়ার আগে যদি কোনও সিগন্যালে বাধা সৃষ্টি করে (যেমন এটি কোনও ডেটা উপলভ্য ছিল না কারণ এটি ব্লক করতে হয়েছিল), এটি errno
[EINTR] এ সেট করে -1 প্রদান করে ।
আ। read()
কোনও ডেটা সফলভাবে কিছু ডেটা পড়ার পরে যদি কোনও সিগন্যালের দ্বারা বাধা হয়ে থাকে (যেমন অনুরোধটি তাত্ক্ষণিকভাবে পরিবেশন করা সম্ভব হয়েছিল), এটি পঠিত বাইটের সংখ্যা প্রদান করে।
প্রশ্ন এ):
আমি কি ধরে নিচ্ছি যে উভয় ক্ষেত্রেই (ব্লক / নো ব্লক) সিগন্যাল সরবরাহ ও পরিচালনা পুরোপুরি স্বচ্ছ নয় read()
?
মামলা i। বোধগম্যতা বোঝার মতো বলে মনে হচ্ছে যেহেতু এই ব্লকিংটি read()
সাধারণত প্রক্রিয়াটিকে TASK_INTERRUPTIBLE
রাজ্যে রাখে যাতে যখন কোনও সংকেত সরবরাহ করা হয় তখন কার্নেলটি প্রক্রিয়াটিকে TASK_RUNNING
রাজ্যে রাখে।
তবে যখন যখন read()
ব্লক করার প্রয়োজন নেই (কেস ii।) এবং কার্নেল-স্পেসে অনুরোধটি প্রক্রিয়া করা হচ্ছে, তখন আমি ভেবেছিলাম যে সিগন্যালের আগমন এবং এর পরিচালনা হ'ল এইচডাব্লুয়ের আগমন এবং সঠিক পরিচালনার মতো স্বচ্ছ হবে would বাধা হবে। বিশেষত আমি ধরে নিয়েছি যে সংকেত সরবরাহের পরে, প্রক্রিয়াটি অস্থায়ীভাবে ব্যবহারকারীর মোডে স্থাপন করা হবে তার সিগন্যাল হ্যান্ডলারটি চালিত করার জন্য যা থেকে এটি অবশেষে ফিরে আসবে বিঘ্নিত read()
(কার্নেল-স্পেসে) প্রসেসিং শেষ করার জন্য যাতে read()
রানগুলি তার রান করে কোর্সটি সম্পূর্ণ হওয়ার পরে যার read()
ফলস্বরূপ উপলব্ধ সমস্ত বাইটগুলি সহ কলটি করার পরে প্রক্রিয়াটি ফিরে আসে (ব্যবহারকারী-স্পেসে) after
তবে ii। read()
এটিকে বোঝা যাচ্ছে যে বাধা পেয়েছে, যেহেতু ডেটা অবিলম্বে উপলব্ধ, তবে এটি কেবলমাত্র কিছু তথ্য (সমস্ত পরিবর্তে) প্রদান করে।
এটি আমার দ্বিতীয় (এবং চূড়ান্ত) প্রশ্নের কাছে নিয়ে আসে:
প্রশ্ন খ):
ক এর অধীনে আমার ধারণাটি যদি সঠিক read()
হয় তবে অনুরোধটি পূরণের জন্য তাত্ক্ষণিকভাবে ডেটা উপস্থিত থাকার কারণে এটি ব্লক করার প্রয়োজন নেই কেন, তা কেন বাধা পাবে? অন্য কথায়, read()
সিগন্যাল হ্যান্ডলারটি কার্যকর করার পরে পুনরায় চালু করা হয় না কেন , ফলস্বরূপ উপলব্ধ সমস্ত ডেটা (যা সর্বোপরি উপলব্ধ ছিল) ফিরে আসে?