2012-04-15 19 views
8

मैं एक मैप्रिडस प्रोग्राम लिख रहा हूं जो कुछ अंतिम परिणाम प्राप्त करने के लिए एकाधिक I/O पाइप (प्रति पाइप एक प्रक्रिया) का उपयोग करता है। मुझे प्रक्रियाओं को बनाने में समस्या है। विशेष रूप से, मैं निम्नलिखित त्रुटि हो रही है:कांटा() - एकाधिक प्रक्रियाओं और सिस्टम कॉल

while (values[inc]!=NULL) //provided array of text lines 
{ 
    if ((pid = fork()) == -1) { 
     perror("fork error"); 
     exit(EXIT_FAILURE); 
    }  

    else if (pid == 0) {    /* start of child process  */ 
     printf("Child process...\n"); 
     /* pipes[inc][1] is a file descriptor to which myMap writes some data 
      using the write() system call 
      mr is a struct that holds other function pointers */ 
     mr->myMap(pipes[inc][1],values[inc]); 
     exit(0); 
    } 
    else {       /* start of parent process  */ 
     printf("Parent process...\n"); 

     if ((wpid = wait(&status)) == -1) 
     /* Wait for child process.  */ 
      perror("wait error"); 
     else {      /* Check status.    */ 
      if (WIFSIGNALED(status) != 0) 
       printf("Child process ended because of signal %d\n", 
         WTERMSIG(status)); 
      else if (WIFEXITED(status) != 0) 
       printf("Child process ended normally; status = %d\n", 
         WEXITSTATUS(status)); 
      else 
       printf("Child process did not end normally\n"); 
     } 
     //close(fd[1]); 

     printf("Parent process ended\n"); 
    } 
    inc++; 
} 

इस के बाद मैं एक धागा

pthread_t newThread; 
pthread_create(&newThread,NULL,threadFunction,values); 
pthread_join(newThread,NULL); 

बनाने रहा threadFunction चयन का उपयोग करता है (:

wait error: Interrupted system call 

यह मेरा कोड है कि प्रक्रियाओं spawns है) यह पता लगाने के लिए कि कौन सी फाइल डिस्क्रिप्टर पढ़ने के लिए तैयार है और इसे पढ़ता है और डेटा को एक शब्दकोश में रखता है।

जब प्रपत्र gdb डीबगर, कार्यक्रम उत्पादन चल रहा है:

Parent process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 
Parent process... 
Child process ended normally; status = 0 
Parent process ended 
Parent process... 
Child process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 

मैं कैसे इस मुद्दे को हल करने के लिए पता नहीं है। कोई सुझाव?

धन्यवाद!

उत्तर

9

आपको अपने wait() को लूप में कॉल करने की आवश्यकता है और यदि यह एक त्रुटि (-1) और errno == EINTR लूप जारी रखता है। कोई अन्य त्रुटि एक वास्तविक त्रुटि है और इसे इस तरह माना जाना चाहिए।

हालात की रूपरेखा टाइमर जैसे संकेतों को पैदा कर सकता है लेकिन संकेत शायद रुकावट पैदा कर रहा है, इस प्रक्रिया के लिए भेजा जाना SIGCHLD जैसा कि आप जानते है जो जब एक बच्चे प्रक्रिया राज्य बदल जाता है कहा जाता है,।

संपादित करें: ठीक है, मैं कोड में जवाब लिखेंगे:

do 
{ 
    wpid = wait(&status); 
} 
while (wpid == -1 && errno == EINTR); 
if (wpid == -1) 
{ 
    perror("wait error"); 
    return -1; 
} 
else 
{ 
    // we have wait status 
    ... 
} 
+0

मुझे यकीन है कि तुम क्या मतलब है नहीं कर रहा हूँ। कृपया विस्तार से बताएं। – Krzysiek

+1

@Rafcio मैंने अपना जवाब अपडेट किया है। – trojanfoe

+1

धन्यवाद। यह समझ में आता है! :) – Krzysiek

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