ইউনিক্স / লিনাক্সে পাইপযুক্ত কমান্ডগুলি বোঝা


16

আমার দুটি সহজ প্রোগ্রাম রয়েছে: Aএবং B। Aপ্রথমে দৌড়াতে হবে, তারপরে B"স্টাডআউট" Aপেয়েছে এবং এটি তার "স্টিডিন" হিসাবে ব্যবহার করে। ধরুন আমি একটি জিএনইউ / লিনাক্স অপারেটিং সিস্টেম ব্যবহার করছি এবং এটি করার সহজতম উপায় হ'ল:

./A | ./B

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



এটি কমান্ড নয়, এটি বাশ প্রক্রিয়া দ্বারা নির্মিত একটি কেনারেল অবজেক্ট, যা প্রসেসের স্টাডআউট এবং বি হিসাবে স্টিডিন হিসাবে ব্যবহৃত হয় দুটি প্রক্রিয়া প্রায় একই সময়ে শুরু হয়।
45 薯条 德里克

1
@ 炸鱼 আপনি সঠিক - কার্নেল পাইপলাইন পাইপফাইস ফাইল সিস্টেমের মধ্যে একটি বস্তু, তবে যতক্ষণ না শেল নিজেই উদ্বিগ্ন - প্রযুক্তিগতভাবে এটি পাইপলাইন কমান্ড
সের্গি কলডিয়াজন্য

উত্তর:


26

আপনার প্রশ্নটি সম্পর্কে যা কেবলমাত্র ভুল হিসাবে দেখা যায় তা হ'ল আপনি

এ প্রথমে দৌড়াবে, তারপরে বি পেয়ে যাবে এ st

আসলে, উভয় প্রোগ্রাম একই সময়ে শুরু হবে। Bএটি যখন পড়ার চেষ্টা করে তখন কোনও ইনপুট না থাকলে, পড়ার ইনপুট না পাওয়া পর্যন্ত এটি ব্লক হয়ে যাবে। তেমনি, যদি কেউ আউটপুট পড়েন নাA পর্যন্ত তার লেখাগুলি ব্লক হয়ে যাবে (এর কিছু পাইপ দিয়ে বাফার করবে)।

পাইপলাইনে অংশ নেওয়া প্রক্রিয়াগুলি সিঙ্ক্রোনাইজ করার একমাত্র বিষয় হ'ল I / O, অর্থাৎ পাইপ জুড়ে পড়া এবং লেখা। যদি কোনও লেখা বা পঠন ঘটে না, তবে দুটি প্রক্রিয়া একে অপরের থেকে সম্পূর্ণ স্বাধীনভাবে চলবে run যদি একজন অন্যের পড়া বা লেখা উপেক্ষা করে তবে অবহেলিত প্রক্রিয়াটি অবরুদ্ধ হবে এবং শেষ পর্যন্ত এ দ্বারা হত্যা করা হবেSIGPIPE সিগন্যালের (যদি লেখা থাকে) বা অন্য প্রক্রিয়াটি সমাপ্ত হলে তার স্ট্যান্ডার্ড ইনপুট স্ট্রিমে (পড়ার ক্ষেত্রে) ফাইলের একটি শেষ শর্ত পেয়ে যায় ।

মূর্খ বর্ণনার উপায় A | Bহ'ল এটি একটি পাইপলাইন যা দুটি প্রোগ্রাম ধারণ করে containing প্রথম প্রোগ্রাম থেকে স্ট্যান্ডার্ড আউটপুট উত্পাদিত আউটপুট দ্বিতীয় দ্বারা স্ট্যান্ডার্ড ইনপুট পড়ার জন্য উপলব্ধ ("[আউটপুট] Aপাইপ করা হয় [ইনপুট] B"))। শেলটি এটি হওয়ার জন্য প্রয়োজনীয় নদীর গভীরতানির্ণয়টি করে।

আপনি যদি "ভোক্তা" এবং "প্রযোজক" শব্দটি ব্যবহার করতে চান তবে আমি মনে করি এটিও ঠিক আছে।

এগুলি সি তে লিখিত প্রোগ্রামগুলি সত্য যে প্রাসঙ্গিক নয়। এটি লিনাক্স, ম্যাকোস, ওপেনবিএসডি বা এআইএক্স প্রাসঙ্গিক নয়।


2
অস্থায়ী ফাইলে লেখার জন্য ডস ব্যবহার করা হত, কারণ এটি একাধিক প্রক্রিয়া সমর্থন করে না।
সিএসএম

2
@ অ্যালেক্সভং নোট করুন যে কোনও অস্থায়ী ফাইল সহ আপনার উদাহরণটি ঠিক সমান নয়। কোনও প্রোগ্রাম কোনও ফাইলের বিষয়বস্তু সন্ধান করতে বেছে নিতে পারে তবে পাইপ থেকে আসা ডেটা অনুসন্ধানযোগ্য নয়। একটি ভাল পরীক্ষার mkfifoনামকরণ করা পাইপ তৈরি করতে ব্যবহার করা, তারপরে পাইপ থেকে পটভূমি পঠন শুরু করে বি এবং তারপরে এটি লেখা writing এটি নিট-পিকিং যদিও প্রভাব একই হবে।
কুসালানন্দ

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

6
@ অ্যালেক্সভং না, এটি পুরোপুরি বন্ধ। এটি এমনকি সাধারণ কিছু ব্যাখ্যা করতেও সক্ষম নয় yes | sed 10q
চাচা বিলি

1
@ ইউনসিল বিলি আমি আপনার উদাহরণের সাথে একমত এটি দেখায় যে সমান্তরাল সম্পাদন সত্যই মাইকেল দ্বারা উল্লেখ করা প্রয়োজন। অন্যথায়, আমরা অ-সমাপ্তি পাব।
অ্যালেক্স ভং

2

ডকুমেন্টেশনে সাধারণত শব্দটি ব্যবহৃত হয় "পাইপলাইন", যা এক বা একাধিক কমান্ড সমন্বিত থাকে, পসিক্স সংজ্ঞাটি দেখুন সুতরাং প্রযুক্তিগতভাবে বলতে গেলে, এটি আপনার কাছে দুটি কমান্ড রয়েছে, শেলের জন্য দুটি সাবপ্রসেসেস (হয় fork()+exec()'বাহ্যিক কমান্ড বা সাব-শেলস ')

হিসাবে প্রযোজক-ভোক্তা অংশ, পাইপলাইন যে প্যাটার্ন দ্বারা বর্ণনা করা যায়, যেহেতু:

  • প্রযোজক এবং গ্রাহক স্থির-আকারের বাফার ভাগ করে নেন এবং লিনাক্স এবং ম্যাকোস এক্স-তে কমপক্ষে পাইপলাইন বাফারের জন্য নির্দিষ্ট আকার রয়েছে
  • প্রযোজক এবং গ্রাহকরা আলগাভাবে মিলিত হয়, পাইপলাইনে কমান্ডগুলি একে অপরের অস্তিত্ব সম্পর্কে জানতে পারে না (যদি না তারা সক্রিয়ভাবে /proc/<pid>/fdডিরেক্টরিটি পরীক্ষা করে থাকে )।
  • নির্মাতারা লেখেন stdoutএবং গ্রাহকরা পড়েন stdinযেন তারা একক আদেশ কার্যকর করা হয়, ওরফে তারা একে অপরকে ছাড়া থাকতে পারে

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

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