ইউনিক্স নন-ব্লকিং I / O: ও_ননব্লোক বনাম ফিউশনবিও


92

বিএসডি সকেট প্রোগ্রামিংয়ের প্রসঙ্গে প্রতিটি উদাহরণ এবং আলোচনার মধ্যে আমি মনে করি যে নন-ব্লকিং আই / ও মোডে কোনও ফাইল বর্ণনাকারী সেট করার প্রস্তাবিত উপায়টি O_NONBLOCKপতাকা ব্যবহার করে fcntl(), যেমন

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

আমি দশ বছরেরও বেশি সময় ধরে ইউএনআইএক্স-এ নেটওয়ার্ক প্রোগ্রামিং করছি, এবং এটি FIONBIO ioctl()করার জন্য সর্বদা কলটি ব্যবহার করেছি :

int opt = 1;
ioctl(fd, FIONBIO, &opt);

আসলেই কেন এতটা চিন্তাভাবনা করেনি। সবেমাত্র সেভাবে শিখেছি।

একজনের বা অন্যের সম্ভাব্য নিজ নিজ যোগ্যতার বিষয়ে কারও কি কোনও মন্তব্য আছে? আমি কল্পনা করি যে পোর্টেবিলিটি লোকস কিছুটা পৃথক হয়েছে, তবে ioctl_list(2)স্বতন্ত্র ioctlপদ্ধতির সেই দিকটি কী পরিমাণে কথা বলবে না তা জানি না ।

উত্তর:


135

মানীকরণের আগে ioctl(... FIONBIO... )এবং fcntl(... O_NDELAY... ছিল ), কিন্তু এগুলি সিস্টেমের মধ্যে এবং এমনকি একই সিস্টেমের মধ্যেও বেমানান আচরণ করেছিল। উদাহরণস্বরূপ, FIONBIOসকেটগুলিতে কাজ করা এবং O_NDELAYপাইপ, ফিফোস এবং ডিভাইসগুলির মতো জিনিসের প্রচুর অসঙ্গতি সহ ttys এ কাজ করা সাধারণ ছিল । এবং যদি আপনি না জানতেন যে আপনার কাছে কী ধরনের ফাইল ডেস্ক্রিপ্টর রয়েছে, তবে আপনাকে উভয়কে নিশ্চিত হতে হবে be তবে তদ্ব্যতীত, কোনও ডেটা উপলব্ধ নেই এমন একটি অ-অবরুদ্ধ পঠনও বেমানানভাবে নির্দেশিত হয়েছিল; ওএস এবং ফাইল বর্ণনাকারীর ধরণের উপর নির্ভর করে পঠন 0, বা -1 এর্ন ই্যাগেইন সহ, বা -1 এরনো ইওলডব্লক সহ ফিরে আসতে পারে। আজও, সেট FIONBIOবাO_NDELAYসোলারিসে কোনও টাইটি বা পাইপে 0 বা কোনও সকেটে এরন ইগেইন সহ -1 ফিরিয়ে আনার জন্য কোনও ডেটা ছাড়াই একটি পঠন সৃষ্টি করে। তবে 0 টি অস্পষ্ট কারণ এটি ইওএফের জন্যও ফিরে আসে।

POSIX এটিকে পরিচয় করিয়ে সম্বোধন করে O_NONBLOCK, যা বিভিন্ন সিস্টেম এবং ফাইল বর্ণনাকারী ধরণগুলিতে মানক আচরণ করে। যেহেতু বিদ্যমান সিস্টেমগুলি সাধারণত আচরণের যে কোনও পরিবর্তন এড়াতে চায় যা পিছিয়ে সামঞ্জস্যতা ভেঙে দিতে পারে, অন্যদের মধ্যে একটির জন্য নির্দিষ্ট আচরণের আদেশ দেওয়ার পরিবর্তে পসআইএক্স একটি নতুন পতাকা সংজ্ঞায়িত করে। লিনাক্সের মতো কিছু সিস্টেমগুলি একই সাথে সমস্ত একই আচরণ করে এবং EAGAIN এবং EWOULDBLOCK কে একই মান হিসাবে সংজ্ঞায়িত করে, তবে পশ্চাদপদ সামঞ্জস্যের জন্য কিছু অন্যান্য উত্তরাধিকার আচরণ বজায় রাখতে ইচ্ছুক সিস্টেমগুলি যখন পুরানো প্রক্রিয়াগুলি ব্যবহৃত হয় তখন এটি করতে পারে।

নতুন প্রোগ্রামগুলিকে পসিক্স দ্বারা মানীকৃত হিসাবে fcntl(... O_NONBLOCK... ব্যবহার করা উচিত )


6
আমি এটির জন্য আইওসিটিএল () ব্যবহার করার প্রবণতা রাখছি কারণ এফসিএনটিএল () এর জন্য দু'জনের চেয়ে অ-ব্লকিং মোড সক্ষম করতে আমার কেবলমাত্র একটি সিস্কেল খরচ হয়। এছাড়াও, উইন্ডোজ আইওক্টসকেট () এপিআই এই কার্যকারিতাটির উদ্দেশ্যে আইওএসটিএল () এর সমতুল্য।
ওয়েজ ফারলং

এনগিনেক্স এটি করতে পারলে এটি করে, এবং একটি মন্তব্য দিয়ে চিহ্নিত করে "আইওসিটিএল (ফায়োনিবিও) একক সিস্টেমে একটি অ-ব্লকিং মোড সেট করে।" এখন অগ্রহণযোগ্য 2 রয়েছে যা আপনাকে একটি সংযোগ গ্রহণ করতে এবং একই সিস্টেমে অ-ব্লকিং মোডে রাখতে দেয়।
ইলফ

6

@ শিয়ান যেমন বলেছিলেন, fcntl()মূলত এটি মানসম্পন্ন, এবং তাই প্ল্যাটফর্মগুলিতে উপলব্ধ। ioctl()ফাংশন চেয়েও পুরনো fcntl()ইউনিক্স, কিন্তু এ সব মান নয়। যে ioctl()আপনাকে সব জুড়ে আপনার জন্য কাজ প্রাসঙ্গিকতা প্ল্যাটফর্মের সৌভাগ্যবান, কিন্তু নিশ্চিত না। বিশেষত, দ্বিতীয় যুক্তির জন্য ব্যবহৃত নামগুলি আরকেন এবং প্ল্যাটফর্মগুলিতে নির্ভরযোগ্য নয়। প্রকৃতপক্ষে, তারা সাধারণত নির্দিষ্ট ডিভাইস ড্রাইভারের কাছে অনন্য হয়ে থাকে যা ফাইল বিবরণকারী উল্লেখ করে। ( ioctl()বিশ বছর আগে পিএনএক্স (পার্ক ইউনিক্স) চলমান আইসিএল পার্কে চলমান বিট-ম্যাপযুক্ত গ্রাফিক্স ডিভাইসের জন্য কলগুলি অন্য কোথাও কখনও অনুবাদ করেনি, উদাহরণস্বরূপ।)


5

আমি বিশ্বাস করি fcntl()একটি পসিক্স ফাংশন। যেখানে হিসাবে ioctl()একটি মান UNIX জিনিস। POSIX io এর একটি তালিকা এখানে । ioctl()খুব কর্নেল / ড্রাইভার / ওএস নির্দিষ্ট জিনিস, তবে আপনি নিশ্চিত যে ইউনিক্সের বেশিরভাগ স্বাদে কাজ করে তা আমি নিশ্চিত। কিছু অন্যান্য ioctl()স্টাফ কেবল নির্দিষ্ট ওএস বা এর কার্নেলের নির্দিষ্ট রেভগুলিতে কাজ করতে পারে।


আমি এআইএনএক্স, সোলারিস, লিনাক্স, * বিএসডি, এবং আইআরআইএক্স-এ কোনও সমস্যা ছাড়াই ফিয়নবিআইও ব্যবহার করেছি। তবে হ্যাঁ, আমি বুঝতে পারি যে এটি উইন্ডোজে কাজ করবে না, উদাহরণস্বরূপ - এটি খুব নির্দিষ্ট কার্নেল প্রয়োগের জন্য নিম্ন-স্তরের ইন্টারফেস। তবুও, আমি ভাবছি যে অন্য কোনও পার্থক্যমূলক কারণ রয়েছে কিনা।
অ্যালেক্স বালশভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.