बाल प्रक्रियाएं एक दूसरे पर प्रतीक्षा - लिनक्स, प्रक्रिया, कांटा, प्रतीक्षापिड

मैंने तीन प्रक्रियाएं बनाई हैं और मैं चाहता हूंउनके काम को सिंक्रनाइज़ करें। विशेष रूप से, मैं चाहता हूं कि पहली प्रक्रिया तीसरे स्थान पर दूसरी, दूसरी पर प्रतीक्षा करें। मूल रूप से उनको विपरीत क्रम में निष्पादित करें जिन्हें वे बनाए गए थे।

यहां मैंने अभी तक क्या किया है।

for (; i < 3 ; i++){
pids[i] = fork();
if (pids[i] == 0)
break;
}
if (pids[i] != 0){
wait(); // Main thread has to wait..
}
else{
if (i == 0){
waitpid(pids[1], &status, 0);
printProcessInfo(0);
}
else if (i == 1){
waitpid(pids[2], &status, 0);
printProcessInfo(1);
}
else if (i == 2){
printProcessInfo(2);
}
}

मैं यह जांचने के लिए उपयोग कर रहा हूं कि मैं किस बाल प्रक्रिया में हूंक्योंकि मुझे लगता है कि मैं बच्चे की प्रक्रिया में सही हूं, इसलिए यदि मैं = 0, मैं वास्तव में मुट्ठी बच्चे में हूं। क्या यह धारणा सच है? किसी भी मामले में मुझे वह ऑर्डर नहीं मिलता है जो मैं चाहता हूं, वास्तव में प्रक्रियाओं को उनके प्राकृतिक क्रम में निष्पादित किया जाता है, जो मैंने रखे गए वेटपिड कॉल को छोड़ दिया है। कोई विचार?

उत्तर:

जवाब के लिए 0 № 1

नहीं, आप 3 और प्रक्रिया प्राप्त कर रहे हैं।

एक सरलीकृत संस्करण पर विचार करें (यह सिर्फ प्रतीक्षा हटा दिया गया है ... आप फोर्क की एक ही संख्या करते हैं):

for (i=0; i < 3 ; i++){
pids[i] = fork();
}

क्योंकि आप वापसी मूल्य की जांच किए बिना, फॉर-लूप के अंदर कांटा करते हैं। माता-पिता और बच्चे दोनों को अपना बच्चा मिलेगा।

    [###############PARENT###############]
|           |           |
i=0         i=1         i=2
|           |           |
[ a0 ]      [ b0 ]      [ c0 ]
/           |
i=1 i=2       i=2
/             |
[a1]   [a2]    [ b1 ]
|
i=2
|
[a3]

इसके लिए वापसी मूल्य की जांच के बाद आपको लूप को तोड़ना होगा fork


संबंधित सवाल
सबसे लोकप्रिय