পাইপ কীভাবে বোঝা যায়


21

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

প্রায়শই শোনা যায় "লিনাক্স / ইউনিক্সের সমস্ত কিছুই একটি ফাইল"। আমি ভাবছি যদি পাইপ আসলে কোনও ফাইল হয় যাতে এটির সাথে সংযুক্ত একটি অংশ পাইপ ফাইলে লেখেন, এবং অন্য অংশটি পাইপ ফাইল থেকে পড়ে? যদি হ্যাঁ, অনামী পাইপের জন্য পাইপ ফাইলটি কোথায় তৈরি করা হয়েছে? ইন / টিএমপি, / দেব, বা ...?

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

উত্তর:


23

আপনার পারফরম্যান্স প্রশ্ন সম্পর্কে, পাইপগুলি ফাইলের চেয়ে বেশি দক্ষ কারণ কোনও ডিস্ক আইও প্রয়োজন হয় না। এর cmd1 | cmd2চেয়ে আরও কার্যকর cmd1 > tmpfile; cmd2 < tmpfile( tmpfileযদি এটি কোনও পাইপ হিসাবে র‌্যাম ডিস্ক বা অন্য মেমরি ডিভাইসে ব্যাকড হয় তবে এটি সত্য হবে না ; তবে এটি যদি নামযুক্ত পাইপ cmd1হয় তবে ব্যাকগ্রাউন্ডে চালানো উচিত কারণ পাইপটি পূর্ণ হয়ে গেলে এর আউটপুট ব্লক করতে পারে) )। আপনার যদি ফলাফলের প্রয়োজন হয় cmd1এবং এখনও এর আউটপুটটি প্রেরণ করতে হয় তবে cmd2আপনার উচিত cmd1 | tee tmpfile | cmd2যা ডিস্ক পড়ার ক্রিয়াকলাপকে সমান্তরালভাবে এড়িয়ে চলতে অনুমতি দেয় cmd1এবং cmd2চালাতে পারে cmd2

অনেকগুলি প্রক্রিয়া একই পাইপে পড়ে / লিখলে নামযুক্ত পাইপগুলি দরকারী। এগুলি তখনও কার্যকর হতে পারে যখন কোনও প্রোগ্রাম তার আইও ফাইল ব্যবহার করার প্রয়োজনের জন্য স্টিডিন / স্টাডআউট ব্যবহারের জন্য ডিজাইন করা হয় না । আমি ইটালিকগুলিতে ফাইলগুলি রেখেছি কারণ নামক পাইপগুলি স্টোরেজ পয়েন্টে হুবহু ফাইল নয় কারণ এগুলি মেমরিতে থাকে এবং একটি নির্দিষ্ট বাফার আকার থাকে, এমনকি যদি তাদের একটি ফাইল-সিস্টেম এন্ট্রি (রেফারেন্স উদ্দেশ্যে) থাকে। অন্যান্য জিনিষ ঠিক মনে: ইউনিক্স ফাইল ছাড়া ফাইলসিস্টেম এন্ট্রি আছে /dev/nullবা অন্যদের এন্ট্রি /devবা /proc

যেহেতু পাইপের (নামযুক্ত এবং নামবিহীন) একটি নির্দিষ্ট বাফার আকার থাকে তাই তাদের পড়ার / লেখার ক্রিয়াকলাপগুলি ব্লক করতে পারে, যার ফলে পড়া / লেখার প্রক্রিয়া IOWait অবস্থায় চলে যেতে পারে। এছাড়াও, মেমরি বাফার থেকে পড়ার সময় আপনি কখন একটি ইওএফ পাবেন? এই আচরণের নিয়মগুলি ভালভাবে সংজ্ঞায়িত করা হয় এবং লোকটিতে এটি পাওয়া যায়।

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

সম্পর্কে "everything in Linux/Unix is a file", আমি একমত না। নামী পাইপগুলিতে ফাইল সিস্টেমের এন্ট্রি থাকে তবে ঠিক ফাইল হয় না। নামহীন পাইপগুলিতে ফাইল সিস্টেমের এন্ট্রি নেই (সম্ভবত এটি ব্যতীত /proc)। তবে ইউএনআইএক্স-এর বেশিরভাগ আইও অপারেশনগুলি পড়া / লেখার ফাংশন ব্যবহার করে সম্পন্ন হয় যার নামবিহীন পাইপ (এবং সকেট) সহ একটি ফাইল বর্ণনাকারী প্রয়োজন । আমি মনে করি না যে আমরা এটি বলতে পারি "everything in Linux/Unix is a file", তবে আমরা অবশ্যই এটি বলতে পারি "most IO in Linux/Unix is done using a file descriptor"


ধন্যবাদ! কোনও পাইপ দ্বারা সংযুক্ত দুটি কমান্ড কি সমান্তরালভাবে চলমান, দ্বিতীয়টির পরিবর্তে প্রথম সমাপ্তির পরে চালানো শুরু করে?
টিম

হ্যাঁ, 2 টি কমান্ড সমান্তরালভাবে চালিত হয়। যদি সেগুলি না থাকে এবং বাফারের চেয়ে 1 ম আউটপুট বেশি হয় তবে এটি অবরুদ্ধ করা হবে। আপনি চালিয়ে cmd1 > fifoএবং cmd2 < fifo2 টি পৃথক শেল দিয়ে এটির সাথে নামকরণ পাইপ তৈরি করে চেষ্টা করতে পারেন mkfifo fifo
jfg956

আপনি যে পরীক্ষা করতে পারেন তা হ'ল চলমান cmd2অবস্থায় হত্যা করা cmd1: cmd1সম্ভবত একটি ভাঙা পাইপ মেসেজের প্রতিবেদন করা বন্ধ করবে।
jfg956

ধন্যবাদ! আপনার অর্থ কি অবরুদ্ধ হবে? যদি এটি ঘটে থাকে তবে এর অর্থ কি ব্লকের পরে প্রবাহের তারিখটি নষ্ট হবে?
টিম

2
ডেটা হারিয়ে যায় না। পাইপ বাফারটি পূর্ণ cmd1হলে পাইপে cmd2লেখাটি কেবল তখনই ফিরে আসবে যখন পাইপ থেকে ডেটা পড়বে। একইভাবে, cmd2পাইপ থেকে পড়া পড়াটি ব্লক হয়ে যাবে যদি পাইপটিতে cmd1লেখার আগ পর্যন্ত বাফারটি খালি থাকে ।
jfg956

4

ইউনিক্স দর্শনের দুটি প্রাথমিক মৌলিক বিষয়

  1. ছোট একটি প্রোগ্রাম করা যা একটি কাজ ভাল করে।
  2. এবং আশা করি প্রতিটি প্রোগ্রামের আউটপুট অন্য কোনও ইনপুট হয়ে উঠবে,
    এখনও অজানা, প্রোগ্রাম।

    পাইপগুলির ব্যবহার আপনাকে
    আপনার কাঙ্ক্ষিত ফলাফল অর্জনের জন্য কমান্ডের অত্যন্ত শক্তিশালী চেইন তৈরি করতে এই দুটি ডিজাইনের মৌলিকগুলির প্রভাবগুলি লাভবান করতে দেয়।

    ফাইলগুলিতে পরিচালিত বেশিরভাগ কমান্ড-লাইন প্রোগ্রামগুলি স্ট্যান্ডার্ড ইন (কীবোর্ডের মাধ্যমে ইনপুট) এবং আউটপুট থেকে স্ট্যান্ডার্ড আউট (
    স্ক্রিনে মুদ্রণ) এ ইনপুট গ্রহণ করতে পারে ।

    কিছু কমান্ড কেবল পাইপের মধ্যেই কাজ করার জন্য ডিজাইন করা হয়েছে যা সরাসরি ফাইলগুলিতে অপারেট করতে পারে না।

    উদাহরণস্বরূপ trকমান্ড

  ls -C | tr 'a-z' 'A-Z'
    cmd1 | cmd2
  • স্ক্রিনের পরিবর্তে cmd2 এর STDIN এ cmd1 এর STDOUT প্রেরণ করে।

  • পাইপ জুড়ে STDERR ফরওয়ার্ড করা হয় না।

    সংক্ষেপে Pipes is character (|)কমান্ড কমান্ড করতে পারেন।

    STDOUT এ লেখার যে কোনও কমান্ড পাইপের বাম দিকে ব্যবহার করা যেতে পারে।

       ls - /etc | less 

    STDIN থেকে পড়া যে কোনও কমান্ড পাইপের ডানদিকে ব্যবহার করা যেতে পারে।

       echo "test print" | lpr 

    একটি traditionalতিহ্যবাহী পাইপ "নামবিহীন" কারণ এটি বেনামে বিদ্যমান এবং প্রক্রিয়াটি যতক্ষণ চলছে ততক্ষণ তা স্থির থাকে। একটি নামী পাইপ সিস্টেম-অবিচলিত এবং প্রক্রিয়াটির জীবনের বাইরেও বিদ্যমান এবং এটি আর ব্যবহার না হয়ে গেলে মুছতে হবে must প্রক্রিয়াগুলি সাধারণত আন্তঃ-প্রক্রিয়া যোগাযোগ (আইপিসি) সম্পাদনের জন্য নামযুক্ত পাইপের (সাধারণত কোনও ফাইল হিসাবে প্রদর্শিত হয়) সংযুক্ত থাকে।

উত্স: http://en.wikedia.org/wiki/Name_pipe


3

অন্যান্য উত্তর পরিপূরক ...

stdin এবং stdout ফাইল বর্ণনাকারী এবং তারা ফাইল হিসাবে পড়া এবং লিখিত হয়। সুতরাং আপনি এটি করতে পারেন echo hi | grep hi, এবং এটি প্রতিধ্বনির স্ট্ডআউটটিকে একটি পাইপের সাথে প্রতিস্থাপন করবে এবং এই পাইপের অন্য প্রান্তে গ্রেপের স্টিডিনকে প্রতিস্থাপন করবে।


1

সবকিছুই একটি ফাইল।

যদি আমরা বাক্যাংশটি খুব আক্ষরিক অর্থে নিই, তবে আমরা "আমাদের কাছে কেবল ফাইল আছে এবং অন্য কিছুই নেই" একটি অর্থ দিয়ে শেষ করব। এটি সঠিক ব্যাখ্যা নয়, তাই কী।

যখন আমরা "সবকিছুই একটি ফাইল" বলি, আমরা বলি না যে সবকিছুই একটি ডিস্কে সঞ্চিত। আমরা বলছি যে সমস্ত কিছুই একটি ফাইলের মতো লাগে, পড়া যায়, লেখা যায়।

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

সব কিছুর একটি ফাইল নাম রয়েছে (কিছু সিস্টেমে: যেমন: দেবিয়ান গ্নু / লিনাক্স এবং অন্যান্য অনেক গ্নু / লিনাক্স)।

  • সমস্ত উন্মুক্ত ফাইল একটি ফাইলের নাম পান। দেখ/proc/self/fd/…
  • নেটওয়ার্ক সকেটগুলি ফাইলের নামের সাথে খোলা যেতে পারে /dev/tcp
    যেমন দেখুনcat </dev/tcp/towel.blinkenlights.nl/23

এই শেষ অংশটি কেবলমাত্র একটি /procফাইল সিস্টেমের সিস্টেমগুলিতে এবং যে /dev/tcpফাইলগুলি (বা শেলগুলি) ফাইল স্ট্রাকচার সরবরাহ করে সেখানে বৈধ ।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.