অনাথ প্রক্রিয়া গ্রুপগুলিতে ইন্টারেক্টিভ শেলগুলি কী করা উচিত?


10

(ইউনিক্সে /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এতিম প্রক্রিয়া গোষ্ঠীতে প্রেরণ করা সবেমাত্র ফেলে দেওয়া হয়েছে (অন্যথায় কিছুই আবার এটি শুরু করতে পারে নি)। অতএব, শিশু শেলটি থামানো হয়নি, তবে এটি এখনও পটভূমিতে রয়েছে, তাই এটি ঠিক এখনই এটি আবার করে। পাখলান পুনরাবৃত্তি.

আমার প্রশ্ন হ'ল একটি কমান্ড লাইনের শেল কীভাবে এই দৃশ্য সনাক্ত করতে পারে এবং এটি করার জন্য সঠিক জিনিসটি কী? আমার দুটি সমাধান রয়েছে, যার একটিও আদর্শ নয়:

  1. যার পিডটি আমাদের গ্রুপের আইডির সাথে মিলে যায় সেই প্রক্রিয়াটি সিগন্যাল করার চেষ্টা করুন। যদি ESRCHএটির সাথে ব্যর্থ হয় তবে এর অর্থ আমরা সম্ভবত অনাথ।
  2. একটি বাইট থেকে একটি অ-ব্লক করা পঠন চেষ্টা করুন /dev/tty। যদি EIOএটির সাথে ব্যর্থ হয় তবে এর অর্থ আমরা সম্ভবত অনাথ।

(আমাদের ট্র্যাকিংয়ের বিষয়টি https://github.com/fish-shell/fish-shell/issues/422 )

আপনার চিন্তার জন্য ধন্যবাদ!

উত্তর:


4

আমি আপনার বিশ্লেষণের সাথে একমত এবং আমি সম্মত হই যে এটির মতো মনে হচ্ছে আপনার প্রক্রিয়া গ্রুপটি এতিম আছে কিনা তা আপনাকে সনাক্ত করতে হবে।

tcsetattrএছাড়াও আগমন বোঝানো হয় EIOযদি প্রক্রিয়া গ্রুপ এতিম হয় (এবং আমরা ব্লক করছি না / SIGTT উপেক্ষা যে অবজেক্টের মধ্যে । এটা একটা চেয়ে কম অনধিকারমূলক উপায় হতে পারে readটার্মিন্যালে।

মনে রাখবেন আপনি এটির সাথে পুনঃ উত্পাদন করতে পারেন:

(bash<&1 &)

আপনার পুনঃনির্দেশের প্রয়োজন অন্যথায় স্টিডিনকে পটভূমিতে কোনও কমান্ড চালানোর সময় / dev / null এ পুনঃনির্দেশ করা হয়।

(bash<&1 & sleep 2)

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

ksh93এর সমাধান এতটা খারাপ নয়: হাল ছেড়ে দেওয়ার আগে কেবল 20 বার (অসীমের পরিবর্তে) সেই লুপটি দিয়ে যান।

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