কেন একটি জম্বি তার সন্তানের জন্য অপেক্ষা করছে?


11

আমি বিভিন্ন উত্সের মাধ্যমে খনন করছি, তবে শিশুদের শস্য কাটার শারীরবৃত্তির একটি ভাল বর্ণনা খুঁজে পাচ্ছি না। আমি বুঝতে চাই কি এটি একটি সহজ কেস।

$ cat <( sleep 100 & wait ) &
[1] 14247
$ ps ax -O pgid | grep $$
12126 12126 S pts/17   00:00:00 bash
14248 12126 S pts/17   00:00:00 bash
14249 12126 S pts/17   00:00:00 sleep 100
14251 14250 S pts/17   00:00:00 grep --color=auto 12126
$ kill -2 14248

$ ps ax -O pgid | grep $$
12126 12126 S pts/17   00:00:00 bash
14248 12126 Z pts/17   00:00:00 [bash] <defunct>
14249 12126 S pts/17   00:00:00 sleep 100
14255 14254 S pts/17   00:00:00 grep --color=auto 12126

জম্বি বাচ্চাটির জন্য অপেক্ষা করছে কেন?

আপনি এই এক ব্যাখ্যা করতে পারেন? এর আরও বিস্তৃত ধারণা পেতে কি আমাকে সি সম্পর্কে জানতে এবং বাশ উত্স কোডটি পড়তে হবে বা কোনও ডকুমেন্টেশন আছে? আমি ইতিমধ্যে পরামর্শ করেছি:

জিএনইউ বাশ, সংস্করণ 4.3.42 (1) -রেলিজ (x86_64-pc-linux-gnu)

লিনাক্স ৪.৪.০-৩১-জেনেরিক # 50-উবুন্টু এসএমপি বুধ জুলাই 13 00:07:12 ইউটিসি 2016 x86_64 x86_64 x86_64 জিএনইউ / লিনাক্স


2
লক্ষ করা উচিত যে বাশের সাথে এর আসলে কোনও সম্পর্ক নেই (আপনি যদি শ্যাশ হিসাবে বাশ ব্যবহার করতে চান তবে এটি দ্বারা প্রচুর প্রক্রিয়া শুরু হবে)। অন্যান্য শেল (tcsh, ksh, zsh, & c) সমস্ত প্রক্রিয়া শুরু করে এবং তাদের সাথে ডিল করার জন্য মূলত একই ওএস ফাংশনগুলি চালায়।
জামেস্কেফ

পছন্দ করুন আপনি যদি নিজের মন্তব্যটিকে একটি পূর্ণাঙ্গ উত্তরে প্রসারিত করতে চান তবে তা দুর্দান্ত।

1
এটি সত্যই কোনও উত্তর নয়, কেবলমাত্র আপনি উল্লেখ করেছেন যে আপনি ভুল জায়গাগুলিতে উত্তরটি সন্ধান করছেন :-) * নিক্স সিস্টেম প্রোগ্রামিংয়ের যে কোনও ভাল বইয়ের লেখার চেয়ে আরও ভাল উত্তর সরবরাহ করা উচিত।
জামেএসকিফ

উত্তর:


17

জম্বিটি তার সন্তানের জন্য অপেক্ষা করছে না। যে কোনও জম্বি প্রক্রিয়াটির মতো, এটি তার পিতামাতাকে সংগ্রহ না করা পর্যন্ত এটি প্রায় থাকে।

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

ps -t $(tty) -O ppid,pgid

আপনি যে প্রক্রিয়াটি হত্যা করছেন তার পিতামাতা cat। যা ঘটে তা হ'ল বাশ cat <( sleep 100 & wait )একটি সাব শীলে পটভূমি কমান্ড চালায় । যেহেতু এই সাবশেলটি কেবল একমাত্র কাজটি হ'ল কিছু পুনর্নির্দেশ স্থাপন এবং তারপরে একটি বাহ্যিক কমান্ড চালানো, এই সাবশেলটি বাহ্যিক আদেশ দ্বারা প্রতিস্থাপিত হয়। রুনডাউন এখানে:

  • মূল বাশ (12126) একটি সন্তানের মধ্যে forkপটভূমি কমান্ড কার্যকর করতে কল করে cat <( sleep 100 & wait )(14247)।
    • শিশুটি (14247) pipeএকটি পাইপ তৈরি করতে কল করে, তারপরে forkপ্রক্রিয়াটি প্রতিস্থাপন চালানোর জন্য একটি শিশু তৈরি করতে বলে sleep 100 & wait
      • নাতি (14248) পটভূমিতে forkচালানোর জন্য কল করে sleep 100। নাতি-নাতি ইন্টারেক্টিভ না হওয়ায় পটভূমি প্রক্রিয়াটি একটি পৃথক প্রক্রিয়া গোষ্ঠীতে চলবে না। তারপরে নাতনি sleepবেরিয়ে যাওয়ার জন্য অপেক্ষা করে its
    • শিশুটি (14247) কল করে setpgid(এটি একটি ইন্টারেক্টিভ শেলের একটি পটভূমি কাজ যাতে এটি নিজস্ব প্রক্রিয়া গ্রুপ পায়), তারপরে execveচালানোর জন্য cat। (আমি কিছুটা অবাক হয়েছি যে ব্যাকগ্রাউন্ড প্রক্রিয়া গ্রুপে প্রক্রিয়াটির প্রতিস্থাপন ঘটছে না))
  • আপনি নাতিকে হত্যা (14248)। এর পিতামাতারা চলছে cat, যা কোনও শিশু প্রক্রিয়া সম্পর্কে কিছুই জানে না এবং কোনও ব্যবসায়িক কলিং নেই wait। যেহেতু নাতির নাতনি তার পিতা-মাতা এটি কাটেন না, তাই নাতনি একটি জম্বি হিসাবে পিছনে থাকে।
  • শেষ পর্যন্ত, catপ্রস্থান করা হয় - হয় আপনি এটি মারার কারণেই, অথবা sleepপাইপটি ফিরে আসে এবং বন্ধ করে দেয় তাই এর catইনপুটটির শেষটি দেখে। এই মুহুর্তে, জম্বিটির পিতামাতার মৃত্যু হয়, তাই জম্বিটি ডিআইআই দ্বারা সংগ্রহ করা হয় এবং আরআর এটি পুনরায় কাটা করে।

আপনি যদি আদেশটি পরিবর্তন করেন change

{ cat <( sleep 100 & wait ); echo done; } &

তারপরে catএকটি পৃথক প্রক্রিয়াতে চালিত হয়, মূল বাশ প্রক্রিয়াটির সন্তানের মধ্যে নয়: প্রথম সন্তানের চালাতে পিছনে থাকতে হয় echo done। এই ক্ষেত্রে, আপনি যদি নাতি-নাতিকে হত্যা করেন তবে এটি একটি জম্বি হিসাবে থাকবে না, কারণ শিশুটি (যা এখনও সেই দখলে বাশ চলছে) এটি কাটবে।

আরও দেখুন লিনাক্স কীভাবে জম্বি প্রক্রিয়া পরিচালনা করে এবং একটি জম্বি এতিম থাকতে পারে? এতিম বাচ্চারা জম্বি ফসল কাটাতে বিরক্ত হবে?


আমি প্রক্রিয়া গ্রুপ জিনিস খুব অবাক হয়েছিল। দেখে মনে হচ্ছে এটি একটি বাগ ছিল এবং এটি এখন ব্যাশ মাস্টার শাখায় স্থির হয়েছে।
পিএসকোকিক

"আসল বাশ তার সন্তানের জন্য অপেক্ষা করে (14247)" কেন বা কোন পথে? সন্তানের ব্যাকগ্রাউন্ডে চলার কথা এবং এর মধ্যে স্পষ্ট কল নেই। মূল বাশ (14246) 14247 এবং 14247 (যা চলছে cat) 14248 (অপেক্ষার জন্য sleep) অপেক্ষা না করে তার মধ্যে পার্থক্য কী ? কার স্মৃতি আছে যে কার জন্য অপেক্ষা করে, যা শিশু (14247) হারিয়েছে এবং মূল বাশটি (14246) তা করেনি, বা হতে পারে যাদের সাইনচিএলডি এর মতো সিগন্যালের একটি তালিকা এবং 14247 (এখন চলছে bash) সাথে সাবস্ক্রাইব করা হয়নি শ্রদ্ধেয় 14248?

1
@ টমাসের অর্থ হ'ল আসল বাশ waitতার সন্তানের দিকে আহ্বান জানায় , অর্থাত এটি এটিকে কাটাচ্ছে। আমি দেখতে পাচ্ছি এটি কীভাবে বিভ্রান্তিকর হবে, আমি সেই বাক্যটি সরিয়ে দিয়েছি যা কালানুক্রমিকভাবে বলতে গেলে সঠিক পয়েন্টেও ছিল না। একটি প্রক্রিয়া মারা গেছে যে তথ্যটি সেই প্রক্রিয়াটির পিতামাতার কাছে যায়, কোনও প্রক্রিয়া অন্য কোনও প্রক্রিয়াটির মৃত্যুর তথ্য পেতে "সাবস্ক্রাইব" করতে পারে না।
গিলস 'অশুভ হওয়া বন্ধ করুন'

6

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

আপনার উদাহরণে, যখন ঘুম শেষ হয় (বা মারা যায়), পিতা-মাতা প্রস্থান স্থিতিগুলি পড়বেন এবং জম্বিগুলি কাটবেন। wait(2)বিস্তারিত জানার জন্য উপরে বর্ণিত দেখুন ।

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