2012-11-28 19 views
5
int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    return 0; 
} 

diagram

में यह कांटा() उदाहरण के हल करने के लिए मैं कैसे fork() अवधारणा के लिए एक नौसिखिया हूँ। उपरोक्त पेड़ (x मूल्यों के साथ) ऊपर वर्णित सी कोड के लिए एक सही समाधान है? नोड्स में मान क्रमशः x उनके प्रक्रियाओं के मान हैं।

और क्या हम बच्चे की प्रक्रिया से मूल प्रक्रिया में मूल्य वापस कर सकते हैं? मान लीजिए उपरोक्त उदाहरण कोड में क्या मैं बच्चे की मूल प्रक्रिया में x मूल्य वापस कर सकता हूं?

+1

कि यहां तक ​​कि संकलन नहीं होंगे। – geoffspear

+1

यह स्पष्ट नहीं है कि आपका ग्राफ क्या है, लेकिन मानते हुए (निर्देशित) किनारों में माता-पिता-बाल प्रक्रिया संबंधों का प्रतिनिधित्व होता है और रूट मूल प्रक्रिया है, तो 5 एक 10 होना चाहिए क्योंकि प्रत्येक 4 प्रक्रियाओं में से प्रत्येक को x से 5 गुना बढ़ाना समाप्त होता है । वैसे भी, यह वास्तव में क्या है कि आप करने की कोशिश कर रहे हैं? – Celada

+0

हां। आरेख में रूट प्रारंभिक मूल प्रक्रिया का प्रतिनिधित्व करता है और निर्देशित किनारों में अभिभावक-बाल संबंध दिखाते हैं। मैं जानना चाहता हूं कि कुल मिलाकर कितने नोड बनते हैं और क्या संबंधित नोड्स में x मान सही हैं या नहीं नहीं धन्यवाद। – starkk92

उत्तर

6

मदद मिल सकती है तुम्हारा मतलब है कि एक प्रक्रिया पेड़ है और बुलबुले में x का मूल्य है? फिर नहीं, यह सही नहीं है।

जब कोई बच्चा पैदा होता है, तो यह माता-पिता की सटीक प्रति प्राप्त करता है ...तो चलो "प्रिंट" कुछ मान तो हम चीजों के राज्य देख सकते हैं

जब हम शुरू करते हैं, यह सिर्फ माता-पिता है (मैं सब कुछ के लिए PIDs अप makeing हूँ):

parent (11174) x = 0, i = 0 

फिर हम fork() मारा

+--parent (11174) x = 0, i = 0 
| 
+->child1 (11175) x = 0, i = 0 

अगला गणित:

parent (11174) x = 5, i = 0 

child1 (11175) x = 5, i = 0 

Wh, अब हम दो प्रक्रियाओं है एन हम पाश वापस ऊपर, हमारे मैं के वृद्धि की जाएगी, और प्रत्येक प्रक्रिया अब पाश चलाता है और हिट fork():

parent (11174) x = 10, i = 1 

child2 (11176) x = 10, i = 1 

child1 (11175) x = 10, i = 1 

child (11177) x = 10, i = 1 

अंत में हर किसी के पाश हिट और:

+--parent (11174) x = 5, i = 1 
| 
+->child2 (11176) x = 5, i = 1 

+--child1 (11175) x = 5, i = 1 
| 
+->child (11177) x = 5, i = 1 

अब हर कोई फिर से गणित हिट वृद्धि i इससे तोड़ना। तो अपने अंतिम परिणाम है:

parent (10)----->child1(10)---->child(10) 
      | 
      +----->child2(10) 
+0

महान स्पष्टीकरण.अब मैं स्पष्ट रूप से समझता हूं कि इन तरह की समस्याओं को कैसे हल किया जाए। धन्यवाद :) – starkk92

+1

@ user1632141 - मदद करने में खुशी! चरणों को लिखना उपयोगी है ताकि आप इसे देख सकें, अगर आप इसे अपने सिर में नहीं कर सकते हैं तो अपने छोटे नमूना कोड को संकलित करें और कुछ प्रिंटफिक्स जोड़ें, जैसे कुछ: 'printf (" process% d: x =% d , i =% d \ n ", getpid(), x, i); 'शुरू करने के लिए एक अच्छी जगह होगी! – Mike

+0

इसे मिला। धन्यवाद .. – starkk92

6

यदि आप fork() पर कॉल करते हैं तो नीचे दिए गए कोड दोनों प्रक्रियाओं के लिए है iee parent और child

fork एक नई प्रक्रिया (जिसे बच्चे के रूप में जाना जाता है) बनाता है जिसका पता स्थान मूल प्रक्रिया से अलग है। तो, उनके बीच कुछ भी साझा नहीं किया जाता है।

आप लूप में वास्तव में 2 बार कॉल कर रहे हैं, तो कुल 4 स्वतंत्र प्रक्रिया होगी।

And also can we return values to the parent process from the child process? 
    Suppose lets say in the above example code can I return the x value of the 
    child to the parent process? 

जवाब है, आप कर सकते हैं यह है: सवाल है इसके लिए

if(!fork()) 
{ 
// child process 
} 
else 
{ 
// parent process 
} 

:

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

1. shared memory 
2. memssage passing (pipe, rpc) 

इसके अलावा इस समस्या को हल करने से पहले आपको बहुत सी चीजों को समझना होगा। विशेष रूप से आप जब fork का उपयोग कर यह करने के लिए कोशिश कर रहे हैं और यह भी मान

लौटना चाहते

आप this

देखना चाहिए या, यह आप more

+0

yes.it मदद करता है। धन्यवाद :) – starkk92

+1

कभी भी, लेकिन याद रखें कि इस समस्या को हल करने से आपको बहुत मदद नहीं मिलेगी, कांटा या किसी भी प्रक्रिया निर्माण और संचार के पीछे अवधारणा प्राप्त करने का प्रयास करें – Omkant

+0

सही। यह समझ में आता है अब मेरे लिए .. – starkk92

2
fork(); 

एक बच्चे की प्रक्रिया बनाता है और उस प्रतियां सभी बच्चे चर के माता पिता की चर।

जनक:

आपका मुख्य कार्यक्रम 2 बच्चों के रूप में आप में उल्लेख के लिए-लूप, जब यह child1 बनाता है, मूल्य, जब यह child2 बनाता i0 है, मूल्य i1 है है बनाने

Child1:

Child1) कांटा के बाद इसके निष्पादन (, i++ मार डाला, अगले चरण (i = 1) में शुरू - हालत सच (1 < 2), Child1, एक और बच्चे को वह यह है कि child3 काँटेदार child3 में i का मूल्य 1 है।

Child2 और Child3:

Child2 और Child3 कांटा के बाद i = 1 साथ इसके निष्पादन शुरू(), i++ मार डाला, अब i2, हालत झूठी हो जाता है, आगे कोई बच्चा पैदा होता है।

3 कुल में बनाई गई प्रक्रियाएं।

कोड:

int x=0; 
int main() 
{ 
    for(i=0;i<2;i++) 
    { 
    fork(); 
    x=x+5; 
    } 
    printf("x = %d\n", x); 
return 0; 
} 

उत्पादन:

x = 10 
x = 10 
x = 10 
x = 10