লিনাক্সে একাধিক থ্রেড সহ সিগন্যাল হ্যান্ডলিং


119

লিনাক্স-এ, যখন কোনও প্রোগ্রাম (সম্ভবত একাধিক থ্রেড থাকে) সিগন্যর, সিগমেন্টএম বা সিগআপের মতো কী ঘটে?

কোন থ্রেড সিগন্যাল বাধা দেয়? একাধিক থ্রেড কি একই সংকেত পেতে পারে? সিগন্যাল পরিচালনার জন্য পুরোপুরি উত্সর্গীকৃত কোনও বিশেষ থ্রেড রয়েছে কি? যদি তা না হয় তবে সেই সূত্রের অভ্যন্তরে কী ঘটে যা সংকেতটি পরিচালনা করতে পারে? সিগন্যাল হ্যান্ডলারের রুটিন শেষ হওয়ার পরে মৃত্যুদন্ড কার্যকর করা কীভাবে শুরু হয়?

উত্তর:


35

আপনি যে লিনাক্স কার্নেলটি ব্যবহার করছেন তার কোনও সংস্করণের উপর ভিত্তি করে এটি সামান্য উপেক্ষিত।

2.6 পিক্সিক থ্রেড ধরে নিচ্ছেন, এবং যদি আপনি ওএস সিগন্যারএম বা সিগআপের প্রেরণের কথা বলছেন, সিগন্যালটি প্রক্রিয়াতে প্রেরণ করা হয়, যা মূল থ্রেড দ্বারা প্রাপ্ত এবং পরিচালিত হয়। পসিক্স থ্রেড ব্যবহার করে, আপনি স্বতন্ত্র থ্রেডগুলিতেও سگরটার পাঠাতে পারেন তবে আমার সন্দেহ হয় যে ওএস যখন প্রক্রিয়াটিতে সংকেত প্রেরণ করে তখন কী ঘটে তা আপনি জিজ্ঞাসা করছেন।

২.6-এ, সিগিটার্মের ফলে শিশুদের থ্রেডগুলি "পরিষ্কার" থেকে বেরিয়ে আসবে, যেখানে ২.৪ হিসাবে শিশু থ্রেডগুলি অনির্দিষ্ট অবস্থায় ফেলে রাখা হয়েছিল।


এবং সিগন্যাল পেলে মূল থ্রেডের ভিতরে কী ঘটে? ধরা যাক আমি SIGUSR1 এর জন্য একটি কাস্টম সংকেত হ্যান্ডলার লিখেছিলাম এবং এখন আমি সেই সংকেতটি প্রক্রিয়াটিতে প্রেরণ করছি। মূল থ্রেডটি সেই সংকেতটি পাবে। এই মুহুর্তে এটি কোনও ফাংশনের মাঝামাঝি হতে পারে। কি ঘটতে যাচ্ছে?

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

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

10
"মূল থ্রেড" বলতে কী বোঝায় সে সম্পর্কে আমি কিছুটা বিভ্রান্ত। এর অর্থ কি এই যে সিগনটারের জন্য হ্যান্ডলারটি সর্বদা মূল থ্রেডে চলবে, বা এটি কোনও থ্রেডে চলতে পারে?
স্টিফেন নট

3
এই উত্তরটি , যেটি বলে যে সংকেতটি পরিচালনা করতে একটি স্বেচ্ছাসেবী থ্রেড বেছে নেওয়া হয়েছে, আপনার উত্তরটির বিরোধিতা করে।
ব্যবহারকারী 202729

134

pthreads(7) বর্ণনা করে যে POSIX.1- এ একটি প্রক্রিয়া ভাগের বৈশিষ্ট্যগুলিতে সমস্ত থ্রেডের প্রয়োজন রয়েছে, সহ:

  • সিগন্যাল স্বভাব

POSIX.1 এ প্রতিটি থ্রেডের জন্য পৃথক হওয়ার জন্য কিছু বৈশিষ্ট্যও প্রয়োজন , যার মধ্যে রয়েছে:

লিনাক্স কার্নেলের complete_signalরুটিনে নিম্নলিখিত কোড ব্লক রয়েছে - মন্তব্যগুলি বেশ কার্যকর:

/*
 * Now find a thread we can wake up to take the signal off the queue.
 *
 * If the main thread wants the signal, it gets first crack.
 * Probably the least surprising to the average bear.
 */
if (wants_signal(sig, p))
        t = p;
else if (!group || thread_group_empty(p))
        /*
         * There is just one thread and it does not need to be woken.
         * It will dequeue unblocked signals before it runs again.
         */
        return;
else {
        /*
         * Otherwise try to find a suitable thread.
         */
        t = signal->curr_target;
        while (!wants_signal(sig, t)) {
                t = next_thread(t);
                if (t == signal->curr_target)
                        /*
                         * No thread needs to be woken.
                         * Any eligible threads will see
                         * the signal in the queue soon.
                         */
                        return;
        }
        signal->curr_target = t;
}

/*
 * Found a killable thread.  If the signal will be fatal,
 * then start taking the whole group down immediately.
 */
if (sig_fatal(p, sig) &&
    !(signal->flags & SIGNAL_GROUP_EXIT) &&
    !sigismember(&t->real_blocked, sig) &&
    (sig == SIGKILL || !p->ptrace)) {
        /*
         * This signal will be fatal to the whole group.
         */

সুতরাং, আপনি দেখতে যে আপনি যেখানে সংকেত বিতরণ করা হয় ভারপ্রাপ্ত আছেন:

যদি আপনার প্রক্রিয়াতে সিগন্যালের স্বভাব নির্ধারণ করা থাকে SIG_IGNবা হয় SIG_DFL, তবে সমস্ত থ্রেডের জন্য সিগন্যালটিকে উপেক্ষা করা হবে (বা ডিফল্ট - হত্যা, কোর, বা উপেক্ষা)।

যদি আপনার প্রক্রিয়াটি কোনও নির্দিষ্ট হ্যান্ডলারের রুটিনে সিগন্যালের স্বভাবকে সেট করে থাকে তবে নির্দিষ্ট থ্রেড সিগন্যাল মাস্কগুলি ব্যবহার করে কোন থ্রেড সংকেত গ্রহণ করবে তা আপনি নিয়ন্ত্রণ করতে পারেন pthread_sigmask(3)। আপনি সেগুলি পরিচালনা করতে একটি থ্রেডকে মনোনীত করতে পারেন, বা নির্দিষ্ট সংকেতের জন্য এই বিকল্পগুলির কোনও মিশ্রণ তৈরি করতে পারেন, বা আপনি লিনাক্স কার্নেলের বর্তমান সংকেতটি মূল থ্রেডে সরবরাহ করার ক্ষেত্রে নির্ভর করছেন behavior

কিছু সংকেত অবশ্য signal(7)ম্যান পৃষ্ঠা অনুসারে বিশেষ :

সম্পূর্ণরূপে একটি প্রক্রিয়া (যেমন কিল (2) ব্যবহার করে প্রেরণ করা হয় ) বা নির্দিষ্ট থ্রেডের (যেমন, সিএসএসইজিভি এবং সিএফএফপিএর মতো নির্দিষ্ট সংকেত) কার্যকর করার ফলস্বরূপ একটি সংকেত তৈরি করা যেতে পারে (এবং এইভাবে বিচারাধীন) may একটি নির্দিষ্ট মেশিন-ভাষার নির্দেশনা থ্রেডকে নির্দেশিত হয়, যেমন pthread_kill (3) ব্যবহার করে নির্দিষ্ট থ্রেডে লক্ষ্যযুক্ত সংকেতগুলি । প্রক্রিয়া-নির্দেশিত সংকেত যে কোনও থ্রেডে সরবরাহ করা যেতে পারে যা বর্তমানে সিগন্যালটি অবরুদ্ধ করে নেই। যদি থ্রেডগুলির একটিরও বেশি সংকেতটি অবরোধবিদ্ধ থাকে, তবে কার্নেল সিগন্যালটি সরবরাহ করার জন্য একটি নির্বিচার থ্রেড চয়ন করে।

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