2012-05-03 15 views
6

मैं एक होमवर्क असाइनमेंट मैं कहाँ fork() उपयोग करने के लिए बनाने की कोशिश कर रहा हूँ, लेकिन मैं नहीं जानता कि क्यों मैं पाश के लिए मेरे माध्यम से उन्हें चलाने के बाद मेरे कांटे नहीं रोक सकता:कांटा() के लिए() पाश में

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main(int argc, char *argv[]){ 
    int limit = argc/2; 
    if(argc%2 == 0){ 

      perror("the number of arguments given must pe even!"); 
      exit(1); 
    } 

    int i; 
    for(i=0; i<=limit; i++){ 
     if(fork()==-1){ 
      perror("childes couldn't be created\n"); 
      exit(1); 
     } 
     if(fork()==0){ 
      printf("fork: %d \n",i); 
      exit(1); 
     } 
     wait(0); 
    } 


    printf("exiting...\n"); 
    return 0; 
} 

आउटपुट:

[email protected]:~/OS/UprocH$ ./exe a b c d 
fork: 0 
fork: 0 
fork: 1 
fork: 1 
fork: 1 
fork: 2 
fork: 2 
fork: 1 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
exiting... 
[email protected]:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting... 
+4

आप एक ही पाश में दो बार forking कर रहे हैं, आपको लगता है कि पता है? –

+0

नोप कैसे आते हैं, क्या वह ... था? : < –

+4

आपने एक कांटा बम बनाया है। आपको कुछ ऐसा करना चाहिए: pid = कांटा(); अगर (पीआईडी ​​<0) ...; अगर (पीआईडी ​​== 0) .... – kofemann

उत्तर

15

डैनियल फिशर एक जवाब प्रदान करने के लिए मुझे मजबूर कर दिया।

बदलें:

if(fork()==-1){} // first fork 
if(fork()==0){} // second fork 

करने के लिए:

pid = fork(); 
if(pid == -1) 
{ 
    ... //failed 
} 
else if(pid == 0) 
{ 
    ... //success 
} 

या एक स्विच बयान का उपयोग करें:

switch(fork()) 
{ 
    case -1: 
     ... // failed 
     break; 
    case 0: 
     ... // success 
     break; 
} 
+2

धन्यवाद! सराहना की, और आपने स्विच के साथ एक अच्छा विचार दिया: डी –

+4

"मजबूर" एक मजबूत शब्द है;) –

0
execl

आप इस्तेमाल कर सकते हैं() या कार्यकारी के कुछ अन्य प्रकार, यह सुनिश्चित करता है कि बच्चे को बनाया जा रहा है माता-पिता से कुछ भी प्राप्त नहीं करता है। यह आपको घातीय बच्चे विस्फोट के बिना बच्चों को लूप के साथ बनाने की अनुमति देगा। उपयुक्त रूप से execl समारोह के तर्कों को संशोधित करने और आप की तरह 3 प्रक्रियाओं बना सकते हैं:

main() 
{ 
    int i,pid[3]; 
    for(i=0;i<3;i++) 
    { 
     pid[i]=fork(); 
     if (pid[i]==0) 
      execl("path",0,0); 
    } 

    sleep(2); 
} 
संबंधित मुद्दे