2011-09-01 17 views
5

मैं एक प्रोग्राम बनाने की कोशिश कर रहा हूं जो एक नई प्रक्रिया बनाने के लिए फोर्क() का उपयोग करता है। नमूना आउटपुट इस तरह दिखना चाहिए:कांटा() बच्चे और अभिभावक प्रक्रिया

यह बाल प्रक्रिया है। मेरा पिड 733 है और मेरे माता-पिता की आईडी 772 है।
यह मूल प्रक्रिया है। मेरे पीआईडी ​​772 है और मेरे बच्चे की आईडी 773.

है यह कैसे मैं अपने कार्यक्रम कोडित है:

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

int main() { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork()); 

    return 0; 
} 

यह आउटपुट में परिणाम:

यह बच्चा प्रक्रिया है। मेरा पिड 22163 है और मेरे माता-पिता की आईडी 0.
यह बाल प्रक्रिया है। मेरा पिड 22162 है और मेरे माता-पिता की आईडी 22163 है।

यह कथन दो बार क्यों प्रिंट कर रहा है और मैं पहली वाक्य में बाल आईडी प्रदर्शित होने के बाद माता-पिता की आईडी को सही तरीके से दिखाने के लिए कैसे प्राप्त कर सकता हूं?

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

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

int main() { 
int pid = fork(); 

if (pid == 0) { 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
} 
else { 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid); 
} 

return 0; 
} 
+2

आपका प्रोग्राम कहीं भी "पैरेंट प्रक्रिया" शब्द मुद्रित करने का प्रयास नहीं करता है। वे प्रोग्राम टेक्स्ट में मौजूद नहीं हैं, आप उन्हें क्यों मुद्रित होने की उम्मीद करते हैं? –

+3

'आदमी कांटा'। इसे पढ़ें। शब्दों को समझें। जब आपके पास जवाब खोजने का कोई साधन नहीं है तो StackOverflow पर जाएं। इस अनुभव के लिए आप एक बेहतर प्रोग्रामर होंगे। – asveikau

+2

इसके अलावा, 'फोर्क' बच्चे को मूल प्रक्रिया आईडी वापस नहीं करता है। यह माता-पिता को बच्चे और बच्चे की आईडी में 0 देता है। इस तरह आप जानते हैं कि कौन सा है। –

उत्तर

9

fork man page पढ़ने के साथ-साथ getppid/getpid मैन पेज पढ़ने से प्रारंभ करें।

से कांटा के

सफलता पर, बच्चे की प्रक्रिया के पीआईडी ​​एक 0 माता पिता के निष्पादन की सूत्र में दिया जाता है, और निष्पादन के बच्चे के सूत्र में दिया जाता है। विफलता पर, 1 -1 माता-पिता के संदर्भ में वापस आ जाएगा, कोई भी बाल प्रक्रिया नहीं बनाई जाएगी, और इरनो उचित रूप से सेट की जाएगी।

यह बच्चा प्रक्रिया है:

तो यह

if ((pid=fork())==0){ 
    printf("yada yada %u and yada yada %u",getpid(),getppid()); 
} 
else{ /* avoids error checking*/ 
    printf("Dont yada yada me, im your parent with pid %u ", getpid()); 
} 

की तर्ज अपने प्रश्न का रूप नीचे कुछ किया जाना चाहिए। मेरा पिड 22163 है और मेरे माता-पिता की आईडी 0.

यह बाल प्रक्रिया है। मेरे पीआईडी ​​22,162 है और मेरे माता-पिता की आईडी 22163.

fork()printf से पहले निष्पादित होता है। तो जब यह पूरा हो जाए, तो आपके पास निष्पादित करने के लिए एक ही निर्देश के साथ दो प्रक्रियाएं होंगी। इसलिए, printf दो बार निष्पादित करेगा। fork() पर कॉल 0 को बाल प्रक्रिया में वापस कर देगा, और बच्चे प्रक्रिया के pid को मूल प्रक्रिया में वापस कर देगा।

आप दो प्रक्रिया चल मिलता है, हर एक को इस अनुदेश बयान पर अमल होगा:

printf ("... My pid is %d and my parent's id is %d",getpid(),0); 

और

printf ("... My pid is %d and my parent's id is %d",getpid(),22163); 

~

लपेट अप करने के लिए, ऊपर रेखा है बच्चे, pid निर्दिष्ट करते हैं। दूसरी पंक्ति मूल प्रक्रिया है, इसकी आईडी निर्दिष्ट (22162) और उसके बच्चे (22163)।

+0

और यह दो बार प्रिंट करता है क्योंकि ... (कांटा के आदमी से): एक नई बाल प्रक्रिया के निर्माण के बाद, दोनों प्रक्रियाएं फोर्क() सिस्टम कॉल के बाद अगले निर्देश निष्पादित करेंगी। इसलिए, हमें माता-पिता को बच्चे से अलग करना है। यह कांटा के लौटे मूल्य() – Icarus

+0

का परीक्षण करके किया जा सकता है, धन्यवाद, यह एक महान टूटना था। मैंने ऊपर अपना संशोधित कोड संपादित किया। ऐसा लगता है कि यह ठीक से काम करता है। क्या आप यह देखने के लिए डबल चेकिंग करेंगे कि मेरा तर्क सही है? – raphnguyen

+0

@raphnguyen हर किसी को अपने माता-पिता की प्रक्रिया आईडी प्राप्त करने के लिए 'getppid()' को कॉल करना चाहिए। आपके नमूने में, मूल प्रक्रिया इसके बजाय अपनी बाल प्रक्रिया आईडी मुद्रित करेगी। – Tom

0

यह दो बार प्रिंट कर रहा है क्योंकि आप printf दो बार फोन कर रहे हैं, एक बार अपने कार्यक्रम के क्रियान्वयन में और एक बार कांटा में। Printf कॉल से अपने कांटा() को लेने का प्रयास करें।

2

यह कथन दो बार प्रिंट कर रहा है क्योंकि यह इसे माता-पिता और बच्चे दोनों के लिए प्रिंट कर रहा है। माता-पिता इस तरह 0

कोशिश कुछ का एक पैरेंट आईडी है:

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid()); 
0

यह सही उत्पादन प्राप्त करने के लिए सही तरीका क्या है .... फिर भी, childs पैरेंट आईडी हो सकता है कभी कभी 1 के रूप में मुद्रित क्योंकि माता-पिता प्रक्रिया समाप्त हो जाती है और पिड = 1 के साथ रूट प्रक्रिया इस अनाथ प्रक्रिया को नियंत्रित करती है।

pid_t pid; 
pid = fork(); 
if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id 
     is %d.\n", getpid(), getppid()); 
else 
    printf("This is the parent process. My pid is %d and my parent's 
     id is %d.\n", getpid(), pid); 
संबंधित मुद्दे