কোন ইউনিক্স প্রক্রিয়া ব্রোকন পাইপ দিয়ে মারা যায়?


30

এখানে আমি কয়েকটি বিকল্পের কথা ভেবেছি, সঠিক কোনটি তা নিশ্চিত নয়।

  1. পাইপ থেকে একটি I / O ত্রুটি পড়েছিল।
  2. পাইপের অপর প্রান্তে লেখা প্রক্রিয়াটি ব্যর্থ হয়ে মারা যায়।
  3. পাইপে লিখতে পারে এমন সমস্ত প্রক্রিয়া এটি বন্ধ করে দিয়েছে।
  4. পাইপের লেখার বাফার পূর্ণ।
  5. পিয়ার ডুপ্লেক্স পাইপের অন্য দিকটি বন্ধ করে দিয়েছে।
  6. লেখা ব্যর্থ হয়েছে কারণ পাইপ থেকে পড়তে পারে এমন কোনও প্রক্রিয়া নেই।
  7. একটি সিস্টেম কল EPIPE ত্রুটি ফিরিয়ে দিয়েছে এবং কোনও ত্রুটি হ্যান্ডলার ইনস্টল করা হয়নি।

তোমার প্রশ্নটি কি? আপনি কি জিজ্ঞাসা করছেন সেগুলির মধ্যে কোনটি সঠিক, বা যদি এমন কোনও জিনিস রয়েছে যা ভাঙা পাইপের কারণ হতে পারে?
এইটবিটটনি

@ আইটবিটনি এগুলির মধ্যে কোনটি সঠিক
সিয়ামি

উত্তর:


38

কোনও প্রক্রিয়া যখন একটি পাইপ (নাম দেওয়া হয় বা না হয়) বা সকেট টাইপ করা সকেট জিপিআরএমে লেখার চেষ্টা করে যখন কোনও পাঠক নেই।

এটা সাধারণত আচরণ চেয়েছিল। একটি সাধারণ উদাহরণ হল:

find . | head -n 1

আপনি findএকবারে headবন্ধ হয়ে যাওয়ার পরে চালিয়ে যেতে চান না (এবং তারপরে কেবল পাইপটিতে পড়ার জন্য কেবলমাত্র ফাইল বর্ণনাকারী উন্মুক্ত করে দেওয়া হয়েছে)।

yesকমান্ড সাধারণত যে সংকেত বিনষ্ট উপর নির্ভর করে।

yes | some-command

কিছু কমান্ড শেষ না হওয়া অবধি "y" লিখবে Will

মনে রাখবেন যে কমান্ডগুলি প্রস্থান করার সময় কেবল এটিই নয়, যখন সমস্ত পাঠক পাইপটিতে তাদের পড়া বন্ধ রাখবেন। ইন:

yes | ( sleep 1; exec <&-; ps -fC yes)
      1 2       1        0

পাইপ থেকে ১ (সাবশেল), তারপরে ২ (সাবশেল + স্লিপ), তারপরে ১ (সাবশেল) থাকবে এবং তারপরে স্টাইলটি স্পষ্টভাবে বন্ধ করে দেওয়ার পরে পাইপটি থেকে 0 ডিডি পড়তে yesহবে এবং তারপরেই একটি সাইনপাইপ পাবেন।

উপরে, বেশিরভাগ শাঁস একটি ব্যবহার করে pipe(2)কিছুক্ষণ ksh93ব্যবহার করে socketpair(2)তবে আচরণটি সেই ক্ষেত্রে একই রকম।

একটি প্রক্রিয়া SIGPIPE, লিখন পদ্ধতি কল উপেক্ষা করে যখন (সাধারণত write, কিন্তু হতে পারে pwrite, send, splice...) একটি সঙ্গে আয় EPIPEত্রুটি। সুতরাং ভাঙা পাইপটি ম্যানুয়ালি হ্যান্ডেল করতে ইচ্ছুক প্রক্রিয়াগুলি সাধারণত SIGPIPE উপেক্ষা করে একটি EPIPE ত্রুটির উপর পদক্ষেপ নিতে পারে।


14

(6)

লেখা ব্যর্থ হয়েছে কারণ পাইপ থেকে পড়তে পারে এমন কোনও প্রক্রিয়া নেই।

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

থেকে man 7 pipe:

যদি কোনও পাইপের পড়ার শেষ উল্লেখ করে সমস্ত ফাইল বর্ণনাকারী বন্ধ করে দেওয়া হয়, তবে কোনও লিখন (2) কলিং প্রক্রিয়াটির জন্য একটি সিগপাইপ সিগন্যাল তৈরি করবে। যদি কলিং প্রক্রিয়াটি এই সিগন্যালটিকে উপেক্ষা করে থাকে তবে লিখুন (2) ত্রুটি EPIPE দিয়ে ব্যর্থ।

সুতরাং "ভাঙা পাইপ" লেখকের কাছে ইওএফ পাঠকের কাছে কী।


0

লেখার প্রক্রিয়াটির আগে পঠন প্রক্রিয়াটি প্রস্থান করলে একটি ভাঙা পাইপ ঘটে। সুতরাং আমি সাথে যেতে হবে (6)


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