(ইউনিক্সে /programming/13718394/ কি- শোল্ড- ইন্টারেক্টিভ- shells-do-in-orphaned- প্রসেস- গ্রুপগুলিতে পরামর্শ অনুযায়ী ইউনিক্সে পুনরায় পোস্টিং )
সংক্ষিপ্ত প্রশ্নটি হল, কোনও শেল টিটিটির মালিকানাধীন অনাথ প্রক্রিয়া গ্রুপে থাকলে কী করা উচিত? তবে আমি দীর্ঘ প্রশ্নটি পড়ার পরামর্শ দিচ্ছি কারণ এটি মজাদার।
আপনার ল্যাপটপটিকে পোর্টেবল স্পেস হিটারে পরিণত করার জন্য একটি মজাদার এবং উত্তেজনাপূর্ণ উপায় আপনার প্রিয় শেলটি ব্যবহার করে (আপনি যদি সেসব tcsh উইয়ার্ডো না হন তবে):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
এটি বাশ এর সিপিইউ 100% এ পেগ করে। zsh এবং মাছগুলি একই কাজ করে, যখন ksh এবং tcsh চাকরি নিয়ন্ত্রণ সম্পর্কে কিছুটা বিড়বিড় করে এবং তারপরে ঝাঁকুনি দেয় যা কিছুটা ভাল তবে খুব বেশি নয়। ওহ, এবং এটি একটি প্ল্যাটফর্ম অজিনস্টিক অপরাধী: ওএস এক্স এবং লিনাক্স উভয়ই আক্রান্ত।
আমার (সম্ভাব্য ভুল) ব্যাখ্যা নিম্নরূপ: শিশু শেল সনাক্ত করে এটা পুরোভূমিতে নয়: tcgetpgrp(0) != getpgrp()। অতএব এটি নিজে বন্ধ করার চেষ্টা করে: killpg(getpgrp(), SIGTTIN)। তবে এর প্রক্রিয়া দলটি এতিম, কারণ এর পিতামাতা (সি প্রোগ্রাম) নেতা ছিলেন এবং মারা গিয়েছিলেন এবং SIGTTINএতিম প্রক্রিয়া গোষ্ঠীতে প্রেরণ করা সবেমাত্র ফেলে দেওয়া হয়েছে (অন্যথায় কিছুই আবার এটি শুরু করতে পারে নি)। অতএব, শিশু শেলটি থামানো হয়নি, তবে এটি এখনও পটভূমিতে রয়েছে, তাই এটি ঠিক এখনই এটি আবার করে। পাখলান পুনরাবৃত্তি.
আমার প্রশ্ন হ'ল একটি কমান্ড লাইনের শেল কীভাবে এই দৃশ্য সনাক্ত করতে পারে এবং এটি করার জন্য সঠিক জিনিসটি কী? আমার দুটি সমাধান রয়েছে, যার একটিও আদর্শ নয়:
- যার পিডটি আমাদের গ্রুপের আইডির সাথে মিলে যায় সেই প্রক্রিয়াটি সিগন্যাল করার চেষ্টা করুন। যদি
ESRCHএটির সাথে ব্যর্থ হয় তবে এর অর্থ আমরা সম্ভবত অনাথ। - একটি বাইট থেকে একটি অ-ব্লক করা পঠন চেষ্টা করুন
/dev/tty। যদিEIOএটির সাথে ব্যর্থ হয় তবে এর অর্থ আমরা সম্ভবত অনাথ।
(আমাদের ট্র্যাকিংয়ের বিষয়টি https://github.com/fish-shell/fish-shell/issues/422 )
আপনার চিন্তার জন্য ধন্যবাদ!