2010-12-04 8 views
12
साथ बंद कर दिया है

मेरे परीक्षण कोडबाल प्रक्रियाओं मर जब माता-पिता की मौत हो गई है, तो उनमें से एक SIGSTOP

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

int main() { 
    int c = fork(); 
    if (c == 0) while(1); 
    c = fork(); 
    if (c == 0) while(1); 
    c = fork(); 
    if (c == 0) while(1); 
    c = fork(); 
    if (c == 0) while(1); 
    while(1); 
} 

तो मैं एक माता पिता और 4 बच्चे की है। जब मैं अभिभावक को मारता हूं, बच्चे माता-पिता के रूप में init के साथ ठीक काम कर रहे हैं। लेकिन अगर मैं बच्चों में से एक (सिगस्टॉप के साथ) रोकता हूं और फिर माता-पिता को मारता हूं, तो बच्चे भी मारे जाते हैं। ऐसा क्यों है?

+3

आपका कोड आपके सीपीयू का उपयोग करके बहुत गर्म कॉफी बनाने का एक बहुत अच्छा तरीका है ... विशेष रूप से यदि आपके पास 4 कोर या अधिक हैं ... –

+0

हाँ, यह है :) लेकिन यह केवल एक परीक्षण के लिए है और यह इसे पूरा करता है भूमिका। – Ximik

+1

महान प्रश्न ... उत्तर देखने के लिए मोहक। मुझे संदेह है कि प्रक्रिया समूह शामिल हैं, लेकिन यह सुनिश्चित नहीं हैं कि कैसे। –

उत्तर

13

स्पष्ट रूप से यदि प्रक्रिया समूह में एक प्रक्रिया बंद कर दी गई है, तो सभी प्रक्रियाओं को SIGHUP के साथ संकेत दिया जाता है और फिर SIGCONT प्रक्रिया समूह के नेता को समाप्त कर दिया जाता है। SIGHUP के लिए डिफ़ॉल्ट हैंडलर प्रक्रिया को समाप्त करता है। यह व्यवहार की उम्मीद है, उदाहरण के लिए दस्तावेज

http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

ऊपर के लिंक से:

एक प्रक्रिया की समाप्ति के एक प्रक्रिया समूह अनाथ हो जाती है, तो और कुछ सदस्य बंद कर दिया है, तो सभी कर रहे हैं पहले SIGHUP भेजा और उसके बाद SIGCONT।

विचार यह है कि शायद के माता-पिता प्रक्रिया समूह नेता नियंत्रण खोल है। (उसी सत्र में लेकिन एक अलग प्रक्रिया समूह।) जितना लंबा यह माता-पिता जीवित है, यह प्रक्रिया समूह में सदस्यों को रोकना और शुरू करना संभाल सकता है। जब यह मर जाता है, जारी रखने के लिए कोई भी नहीं हो सकता है। इसलिए, इन रुक गई प्रक्रियाओं को SIGHUP भेजा गया है, इसलिए कि वे मर जाते हैं या इसे अनदेखा करते हैं, और उसके बाद SIGCONT उन्हें जारी रखें।

संपादित करें:

Btw, strace इस तरह सामान की तह तक प्राप्त करने के लिए एक अद्भुत उपकरण है। यदि आप बच्चे की प्रक्रियाओं में से किसी एक को चिपकते हैं तो आप देखेंगे कि SIGHUP केवल तब वितरित किया जाता है जब माता-पिता (यानी प्रक्रिया समूह नेता) मर जाता है तो तब से एक बंद हो जाता है।

आपको उदाहरण के लिए SIGHUP के लिए हैंडलर बदलने की आवश्यकता है उदा। सिग्नेक्शन (2) यदि आप चाहते हैं कि बच्चे जीवित रहें।

+0

यदि आप इस तरह से प्रोग्राम शुरू करते हैं कि यह एक नए प्रक्रिया समूह का उपयोग नहीं करता है (उदा। इसे खोल के बजाय 'at'' के साथ चला रहा है, तो यह व्यवहार प्रदर्शित नहीं होता है। मैंने एक बच्चे को 'रोक' भेजा, माता-पिता को मार डाला, और बच्चे अभी भी इस सेटअप के साथ चल रहे थे। –

+0

वैसे, 'स्ट्रेस' क्या होता है यह देखने के लिए एक अच्छा उपकरण होता। –

+0

@ आर ..: स्ट्रेस वह है जो मुझे इस के लिए सही रास्ते पर रखता है ... – thkala

0

बच्चे समान प्रक्रिया समूह के माता-पिता प्रक्रिया के रूप में हैं और इस प्रकार उनकी मूल प्रक्रिया के साथ मिलकर मारे जाते हैं।

संकेत: प्रक्रिया को निलंबित करने के लिए while(1); का उपयोग न करें। इसे sleep अनिश्चित काल तक दें।

+0

के लिए कॉफी मशीन स्पष्ट रूप से मेरे सिस्टम पर सच नहीं है। क्या आपने इसे आजमाया? – thkala

+0

@thkala मैंने इसे केवल फेडोरा और आर्कलिनक्स में आजमाया है। क्या आप कह सकते हैं, तुम्हारा क्या है? – Ximik

+0

@goreSplatter लेकिन फिर अगर मैं सिगस्टॉप नहीं भेजता तो वे क्यों नहीं मारे जाते हैं? – Ximik

संबंधित मुद्दे