ফিফো, পাইপ এবং ইউনিক্স ডোমেনটি কি লিনাক্স কার্নেলের একই জিনিস?


30

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


নীচের উত্তর থেকে আমি বুঝতে পেরেছি যে আমার প্রশ্নটি এক ধরণের অস্পষ্ট এবং এর উত্তর দেওয়া শক্ত। সম্ভবত কার্নেলের প্রয়োগকারী স্টাফগুলির এতগুলি বিবরণ কেউ জানতে পারে না (এমনকি কার্নেল বিকাশকারীদের জন্যও)। যদি কেউ নিশ্চিত করতে পারেন যে ইউনিক্স ডোমেন সকেট, পাইপ এবং ফিফো তারা সকলেই লিনাক্সের অধীনে ভাগ করা মেমোরিতে পাঠানো ডেটা বাফার করে তবে আমার প্রশ্নটি সমাধান হয়ে গেছে। আচ্ছা ... আংশিক সমাধান হয়েছে।
জাস্টিন

ফিফো = নামযুক্ত পাইপ! = পাইপ। ফিফগুলি সকেট জোড়ার মতো দ্বিদ্বিতীয় হতে পারে। নিয়মিত পাইপগুলি একমুখী হয়। সবারই ফাইল ইন্টারফেস এবং ফাইল শব্দার্থবিজ্ঞান রয়েছে। বাস্তবায়ন আপনার পক্ষে কেন গুরুত্বপূর্ণ?
পিএসকোকিক

আমি জানি পাইপগুলি বৃত্তাকার বাফার এবং স্ট্রিম সিস্টেমের সাথে এগুলি ভাগ করে নেওয়া যেতে পারে তবে লিনাক্স ডিফল্টরূপে স্ট্র্যাম ব্যবহার করে না। আমার বিশ্বাস লিনাক্স এই আইপিসি চ্যানেলগুলিকে হার্ডকোড করে। যদিও আমি চেক করে মনে করি না। : ডি আপনি না কেন? কোডটি সর্বজনীনভাবে উপলভ্য।
পিএসকোকিক

যদি তারা সকলেই একই বাস্তবায়ন ভাগ করে নেয় তবে তাদের দক্ষতা একে অপরের কাছাকাছি হওয়া উচিত। এবং আমার কাছে কার্নেল কোডটি বোঝা খুব শক্ত।
জাস্টিন 12

উত্তর:


35

ইউনিক্স ডোমেন সকেট এবং ফিফো তাদের প্রয়োগের কিছু অংশ ভাগ করতে পারে তবে তারা ধারণাগতভাবে খুব আলাদা। ফিফো খুব নিম্ন স্তরে কাজ করে। একটি প্রক্রিয়া পাইপে বাইট লিখে এবং অন্য একটি এটি থেকে পড়ে। একটি ইউনিক্স ডোমেন সকেটের টিসিপি / আইপি সকেটের মতো আচরণ behavior

একটি সকেট দ্বি নির্দেশমূলক এবং একযোগে প্রচুর প্রক্রিয়া দ্বারা ব্যবহৃত হতে পারে। একটি প্রক্রিয়া একই সকেটে অনেক সংযোগ গ্রহণ করতে পারে এবং একই সাথে বেশ কয়েকটি ক্লায়েন্টকে উপস্থিত হতে পারে। কার্নেল প্রতিবার একটি নতুন ফাইল বর্ণনাকারী সরবরাহ করে connect(2)বা accept(2)সকেটে ডাকা হয়। প্যাকেটগুলি সর্বদা সঠিক প্রক্রিয়াতে যাবে।
একটি ফিফোতে, এটি অসম্ভব হবে। দ্বি নির্দেশমূলক যোগাযোগের জন্য আপনার দুটি ফিফো দরকার এবং আপনার প্রতিটি ক্লায়েন্টের জন্য আপনার একজোড়া ফিফো দরকার। নির্বাচনী উপায়ে লেখার বা পড়ার কোনও উপায় নেই, কারণ সেগুলি যোগাযোগের অনেক বেশি প্রাথমিক উপায়।

বেনামে পাইপ এবং FIFO গুলি খুব মিল। পার্থক্যটি হ'ল অজানা পাইপগুলি ফাইল সিস্টেমে ফাইল হিসাবে উপস্থিত নেই তাই কোনও প্রক্রিয়া open(2)এটি করতে পারে না। এগুলি এমন প্রক্রিয়াগুলি দ্বারা ব্যবহৃত হয় যা তাদের অন্য পদ্ধতিতে ভাগ করে। যদি কোনও প্রক্রিয়া একটি এফআইএফওগুলি খোলে এবং তারপরে সম্পাদনা করে, উদাহরণস্বরূপ, ক fork(2), এর শিশু তার ফাইল বিবরণকারী এবং এর মধ্যে পাইপের উত্তরাধিকারী হবে।

UNIX ডোমেন সকেট, বেনামে পাইপ এবং FIFO গুলি ভাগ করে নেওয়া মেমরি বিভাগগুলিতে ব্যবহার করে এমনভাবে একই। বাস্তবায়নের বিশদটি এক সিস্টেম থেকে অন্য সিস্টেমে পরিবর্তিত হতে পারে তবে ধারণাটি সর্বদা একই থাকে: দুটি স্বতন্ত্র প্রক্রিয়া মেমরির ম্যাপিংয়ে মেমরির একই অংশ সংযুক্ত করুন যাতে তাদের ডেটা ভাগ করে নেওয়া হয়
( সম্পাদনা করুন: এটি বাস্তবায়নের একটি সুস্পষ্ট উপায় তবে তা হ'ল) এটি লিনাক্সে কীভাবে করা হয় তা নয়, যা কেবল বাফারদের জন্য কার্নেল মেমরি ব্যবহার করে, নীচে @ tjb63 দ্বারা উত্তর দেখুন)।
এর পরে কার্নেল সিস্টেম কলগুলি পরিচালনা করে এবং প্রক্রিয়াটি বিমূর্ত করে।


"ইউনিক্স ডোমেন সকেট এবং ফিফো তাদের বাস্তবায়নের কিছু অংশ ভাগ করে নিতে পারে" ... বিষয়টি হ'ল "কিছু অংশ" ... আমি ঠিক বুঝতে পেরেছি যে আমার প্রশ্নটি একটি দ্বিধাগ্রস্থ এবং এর উত্তর দেওয়া শক্ত to সম্ভবত কার্নেলের মধ্যে কী অংশগুলি ভাগ করা হয়েছে (এমনকি কার্নেল বিকাশকারীদের জন্যও) তার এতগুলি বিশদ কেউ জানতে পারে না। তবুও ... কেউ কি ইউনিক্স ডোমেন সকেট, পাইপ এবং FIFO- কে নিশ্চিত করতে পারে যে তারা লিনাক্সের অধীনে ভাগ করা মেমরিতে পাঠানো ডেটা বাফার করে? যদি এটি নিশ্চিত হয় তবে আমার প্রশ্নটি সমাধান হয়ে গেছে। আচ্ছা ... আংশিক সমাধান হয়েছে।
জাস্টিন

ঠিক আছে, হ্যাঁ, কার্নেল দ্বারা পরিচালিত একটি বাফার রয়েছে। উদাহরণস্বরূপ, ফিফগুলির সাহায্যে আপনি লেখককে হত্যা করতে পারেন এবং লেখকের মৃত্যুর আগে পাইপটিতে যা পাঠানো হয়েছিল পাঠক এখনও তা করতে পারেন। সকেটগুলির সাথে, এটি কিছুটা জটিল কারণ তারা সংযুক্ত প্রোটোকল দিয়ে কাজ করে। তবে আপনি যদি সকেটের কাছে একটি প্রেরণ করেন, বলুন এবং তারপরে সুযোগের বাইরে চলে যান যাতে প্রেরকের স্ট্যাক থেকে ইন্ট সাফ হয়ে যায়, প্রাপক এখনও এটি পড়তে পারেন। সুতরাং, স্পষ্টভাবে কোথাও একটি বাফার আছে।
দীর্ঘমেয়াদে

মন্তব্যটি পুনরায় পড়া, নিশ্চিত নয় যে আমি এখানে পরিষ্কার করছি ... এখনও কিছু অস্পষ্ট আছে কিনা তা আমাকে জানান।
দীর্ঘমেয়াদে

আপনার মন্তব্য আমার কাছে পরিষ্কার।
জাস্টিন

7

এখানে এটির জন্য বেশ ভাল আলোচনা রয়েছে: http://www.slideshare.net/divyekapoor/linux-kernel-implementation-of-pines-and-fifos

যতদূর আমি দেখতে পাচ্ছি, উভয়ই উপস্থাপনা স্লাইডগুলি এবং উত্স @ http://lxr.free-electrons.com/source/fs/pipe.c - ফিফোগুলি পাইপের চারপাশে মোড়ক হিসাবে প্রয়োগ করা হয়, এবং পাইপের নিজস্বগুলি পাইপফ ভার্চুয়াল ফাইল সিস্টেমের মাধ্যমে প্রয়োগ করা হয়েছে ..

@ লিগার্জেট - পাইপগুলি পাঠক এবং লেখকদের মধ্যে বাফারগুলির জন্য কার্নেল মেমরি ব্যবহার করতে দেখা যায় - তারা 'ভাগ করা মেমরি' ব্যবহার করে না এবং ব্যবহারকারীর এবং কার্নেল ঠিকানা স্পেসের মধ্যে মেমরি অনুলিপি করে (যেমন pipe_readকলগুলি pipe_iov_copy_to_user, যা কল করে __copy_to_user_inatomic(বা copy_to_user) । __copy_to_user_inatomicকল copy_user_generic, যা বেশ কয়েকটি এএসএম বাস্তবায়ন চলছে।


4

একটি "ফিফো" এবং " নামযুক্ত পাইপ" একই জিনিস - যদিও শেল কমান্ড-লাইনের দুটি কমান্ডের মধ্যে একটি "পাইপ" (|) পরিচালনা করে তা থেকে এটি সম্পূর্ণ আলাদা different

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


1
হ্যাঁ, ইউনিক্স ডোমেন সকেট ধরণের সকেট, সুতরাং এটির এপিআই অন্যান্য সকেটের এপিআই যেমন টিসিপি বা ইউডিপি ইত্যাদির অনুরূপ, তবে ইউনিক্স ডোমেন সকেটটি কেবলমাত্র "স্থানীয়" আইপিসি হিসাবে ব্যবহার করা যেতে পারে। এবং এটি যেভাবে ডেটা স্থানান্তর করে তা প্রথম প্রথম পদ্ধতিতে, ফিফো এবং পাইপের মতো বেশ। সুতরাং আমি মনে করি এটি সম্ভব ইউনিক্স ডোমেন সকেটের এপিআই হ'ল অভিন্ন বাস্তবায়নের অন্য একটি এনক্যাপসুলেশন তাই আমরা এটি ব্যবহার করি যেন এটি সকেট। আমি মনে করি এটি সম্ভব সকলেই কার্নেলের মধ্যে একই অভ্যন্তরীণ ভাগ করে নেবে ... আমি এটি সত্য কিনা না তা নিশ্চিত করতে চাই।
জাস্টিন

1

আমি তো জাস্টিনকে ভাবি না। যদি আমি ভুল না হয়ে থাকি এবং আমি সম্ভবত সম্ভব হয় তবে আমার মনে হয় ফিফগুলি ডিস্কে একটি ফাইল ব্যবহার করে এবং ইউনিক্স ডোমেন সকেটগুলি কার্নেল মেমরি ব্যবহার করে।

এছাড়াও, উপরের পোস্টারের সংযোজন হিসাবে কে উল্লেখ করেছেন যে ইউনিক্স ডোমেন সকেটগুলি দ্বি-দিকনির্দেশক, কেবলমাত্র যখন সোকপ্রিমের সকেট ব্যবহার করা হয়। SOCK_DGRAM ইউনিক্স ডোমেন সকেটগুলি প্রকৃতপক্ষে ইউনি-দিকনির্দেশক এবং কেবল সংযোগ () নামক কোড থেকে বিনড () নামক কোডটিতে কেবল () প্রেরণ করতে পারে।

অবশ্যই, কোডটি যা সংযুক্ত () বলে তার নিজের শেষ পয়েন্টটি তৈরি করতে অবশ্যই বিন্দুকে () কল করতে হবে, তবে এটির আপনার প্রশ্নের সাথে কোনও সম্পর্ক নেই।


3
স্ট্যাকএক্সচেঞ্জ এ আপনাকে স্বাগতম, এবং পোস্ট করার জন্য আপনাকে ধন্যবাদ। কয়েকটি মন্তব্য ... 1) আপনি যদি "যথেষ্ট সম্ভবত" ভুল করে থাকেন তবে উত্তর দেওয়ার আগে আপনার ডাবল-চেক করা উচিত; এই সাইটটি কোনও ফোরাম বা চ্যাট নয়। 2) ডেটাগ্রাম ওরিয়েন্টেড সকেটে আপনার যথার্থতার জন্য আপনাকে ধন্যবাদ 3) প্রশ্নের সাথে "করার কিছু নেই" এমন কিছু পোস্ট করার দরকার নেই। :)
বৃহস্পতিবার

1

আমার 2 সেন্ট ... ফিফো এবং ইউনিক্স সকেট উভয় দ্বি-দিকনির্দেশক (অনুরূপ) তবে সকেটে স্টার টপোলজি রয়েছে যখন একটি ফিফো কেবল একটি সারি (এবং সুতরাং একে অপরের প্রতিস্থাপন করতে পারে না), হ্যাঁ তাদের প্রয়োগটি অভ্যন্তরীণভাবে কোড ভাগ করতে পারে।

**

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDWR);   //so that you can read/write to it
 ...
write(fd, buff1, sizeof(buff1));  
getchar();//wait till some one reds this and writes something else
int sz=read(fd, buff1, sizeof(buff1));  //read that something**

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