कांटा () और कैसे संकेतों को प्रक्रियाओं तक पहुंचाया जाता है


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

POSIX में संकेतों और संकेतों के बीच बातचीत कीfork एक लंबी चर्चा है । यहाँ इसका सबसे अधिक सामग्री हिस्सा यह है कि:

कांटा () के बाद प्रक्रिया समूह को भेजे गए एक संकेत को माता-पिता और बच्चे दोनों को दिया जाना चाहिए।

उन्होंने यह भी ध्यान दिया कि कुछ सिस्टम बिल्कुल सही तरीके से व्यवहार नहीं कर सकते हैं, विशेष रूप से जब सिग्नल समय के बहुत करीब पहुंचता है fork()। यह पता लगाना कि क्या आप उन प्रणालियों में से एक हैं, शायद कोड को पढ़ने या बहुत भाग्य की आवश्यकता है, क्योंकि प्रत्येक व्यक्तिगत प्रयास में इंटरैक्शन गायब नहीं होते हैं।

अन्य उपयोगी बिंदु हैं:

  • एक संकेत मैन्युअल रूप से उत्पन्न होता है और एक व्यक्तिगत प्रक्रिया (शायद साथ kill) को भेजा जाता है, केवल उस प्रक्रिया तक पहुंचाया जाएगा , चाहे वह माता-पिता या बच्चा हो।
  • सिग्नल हैंडलर प्रक्रियाओं के बीच चलने वाले आदेश को परिभाषित नहीं किया गया है, इसलिए आप पहले निष्पादित करने पर भरोसा नहीं कर सकते।
  • यदि आप एक बाधा हैंडलर को परिभाषित नहीं करते हैं (या संकेत को स्पष्ट रूप से अनदेखा करते हैं), तो दोनों प्रक्रियाएं केवल एक SIGINTकोड (डिफ़ॉल्ट व्यवहार) के साथ बाहर निकलेंगी।
  • यदि कोई सिग्नल को नॉन-फैटली हैंडल करता है और दूसरा नहीं करता है, तो हैंडलर के बिना एक व्यक्ति मर जाएगा और दूसरा जारी रहेगा।

मुझे लगता है कि गोले दिलचस्प तरीकों से भी हस्तक्षेप कर सकते हैं? यदि यह एक संकेत है कि वे फंस सकते हैं, तो यह अपने बच्चों को भेज सकता है? (और फिर SIGHUP है) (इसका मतलब यह हो सकता है कि जब OS सिग्नल नहीं भेजता है, तो एक बच्चे की प्रक्रिया माता-पिता के संकेत से अप्रभावित नहीं हो सकती है ...)
Gert van den Berg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.