কাঁটাচামচ () এবং কীভাবে সংকেতগুলি প্রক্রিয়াগুলিতে সরবরাহ করা হয়


13

আমি প্রোগ্রাম করি যা আমি সি ফর্ক () 'র একটি শিশু প্রক্রিয়া বন্ধ করে লিখেছি। কোনও প্রক্রিয়াও শেষ হবে না। আমি যদি কমান্ড লাইন থেকে প্রোগ্রামটি চালু করি এবং নিয়ন্ত্রণ-সি টিপুন তবে কোন প্রক্রিয়া (এস) বাধা সংকেত পাবে?

উত্তর:


20

কেন আমরা এটি চেষ্টা করে দেখতে পারি না? পিতা-মাতা এবং শিশু উভয় প্রক্রিয়াকে signal(3)ফাঁদে ফেলতে SIGINTএবং প্রক্রিয়াটি পৌঁছে দেওয়ার সময় একটি বার্তা প্রিন্ট করে ব্যবহার করার জন্য এখানে একটি তুচ্ছ প্রোগ্রাম ।

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
    if (!fork()) {
        signal(SIGINT, &child_trap);
        sleep(1000);
        exit(0);
    }
    signal(SIGINT, &parent_trap);
    sleep(1000);
    return 0;
}

চল যে কল test.c। এখন আমরা এটি চালাতে পারি:

$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!

টার্মিনালে উত্পন্ন বিঘ্নিত সংকেতগুলি সক্রিয় প্রক্রিয়া গোষ্ঠীতে সরবরাহ করা হয়, যেখানে এখানে পিতামাতা এবং শিশু উভয়ই অন্তর্ভুক্ত রয়েছে । আপনি দেখতে পাচ্ছেন যে উভয়ই কার্যকর হয়েছিল child_trapএবং parent_trapযখন আমি চাপলাম তখন Ctrl- C

একটা হল মধ্যে পারস্পরিক ক্রিয়ার লম্বা আলোচনা forkPOSIX এবং সংকেত । এখানে এর সবচেয়ে উপাদান অংশটি হ'ল:

কাঁটাচামচ () এর পরে প্রক্রিয়া গোষ্ঠীতে প্রেরিত একটি সংকেত পিতামাতা এবং সন্তানের উভয়কেই সরবরাহ করা উচিত।

তারা আরও লক্ষ করে যে কিছু সিস্টেম সম্ভবত সঠিক উপায়ে আচরণ করতে পারে না, বিশেষত যখন সংকেতের সময়টির খুব কাছাকাছি আসে fork()। আপনি সেই সিস্টেমে যে কোনও একটিতে আছেন কিনা তা নির্ধারণের জন্য সম্ভবত কোড পড়া বা প্রচুর ভাগ্য প্রয়োজন, কারণ প্রতিটি পৃথক প্রয়াসে মিথস্ক্রিয়াগুলি সম্ভাব্য নয়।

অন্যান্য দরকারী পয়েন্টগুলি হ'ল:

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

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