2010-01-27 18 views
6

कार्यक्रम 1 से एन तक संख्याओं की गणना करता है .. बाल प्रक्रिया EVEN संख्याओं की गणना की गणना करती है। अभिभावक प्रक्रिया विषम संख्याओं की गणना की गणना करती है। मैं मूल प्रक्रिया में बाल प्रक्रिया का वापसी मूल्य प्राप्त करना चाहता हूं। मैं यह कैसे कर सकता हूंबच्चे प्रक्रिया से वापसी मूल्य कैसे प्राप्त करें?

#include<stdio.h> 
#include<errno.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<fcntl.h> 

int main() 
{ 
    int N; 
    int id; 
    int fd_result;; 

    printf("Enter N till which you want the sum: \n"); 
    scanf("%d",&N); 
    if ((fd_result=creat("result", 600))== -1) 
    { 
     perror("Error creating file"); 
     exit(1); 
    } 
    if ((fd_result=open("result",O_TRUNC | O_RDWR)) == -1) 
    { 
     perror("Error Opening file"); 
     exit(1); 
    } 
    if ((id=fork())<0) 
    { 
     perror("Error occurred forking....!"); 
     exit(errno); 
    } 
    if (id == 0) 
    { 
     int i; 
     int sum=0; 
     for (i=0;i<=N;i=i+2) 
      sum+=i; 
     printf("Child sum: %d",sum); 
     if (write(fd_result,&sum,sizeof(int))==-1) perror("Error writing to file"); 
     _exit(0); 
    } 


    if (id > 0) 
    { 
     int i; 
     int sum=0; 
     int sum_odd; 
     for (i=1;i<=N;i=i+2) 
      sum+=i; 
     lseek(fd_result,0,SEEK_SET); 
     read(fd_result,&sum_odd,sizeof(int)); 
     printf("\nThe sum is: %d",sum+(int)sum_odd); 
    } 

    close(fd_result); 
    return 0; 
} 

Pls मुझे बताएं कि मुझे बाल प्रक्रिया का वापसी मूल्य कैसे प्राप्त होता है?

उत्तर

9

जो आप खोज रहे हैं wait() या waitpid() है।

+0

मैं वास्तव में इसका उपयोग कैसे करूं? मैं इसे पाने में सक्षम नहीं हूं। असल में यह पहली बार मैंने एक कांटा() प्रोग्राम लिखा है ... pls मदद –

+0

अभिभावक कॉल प्रतीक्षापिड (-1, और स्थिति, 0) में; –

+3

बाद में, printf ("स्थिति लौटा:% d", WEXITSTATUS (स्थिति)); ... –

1

जैसे डीटीएमलानो ने कहा कि आपको प्रतीक्षा या प्रतीक्षा करने के लिए प्रतीक्षा या प्रतीक्षा का उपयोग करना चाहिए।

लेकिन शायद आपको अपने कार्यक्रम को दो हिस्सों में विभाजित करना चाहिए और बेटे को निष्पादन के साथ निष्पादित करना चाहिए। जब आप कांटा बनाते हैं तो आपके बच्चे की प्रक्रिया को पिड बराबर 0 प्राप्त होता है और मुझे नहीं पता कि क्या आप पिड 0 के साथ प्रक्रिया के सिग्नल का इंतजार करने का प्रयास करते हैं, ठीक काम करेगा।

वैसे भी आप पास कर सकते हैं, हालांकि यह सबसे अच्छा तरीका नहीं है, बाहर निकलने के माध्यम से आपके बच्चे की प्रक्रिया द्वारा गणना की गई मान।

1

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

2

ओह! यह बाश नहीं है! वैसे भी ...

प्रक्रिया को बढ़ाने का कारण मुख्य प्रवाह जारी रखना है, इस बीच कुछ ऐसा करना जो इससे प्रभावित नहीं होता है। मैं 10k छवियों की निर्देशिकाओं के माध्यम से चल रहा हूं, & डुप्लिकेट बाहर ले जा रहा है। मैंने तुलना कोड को एक फंक्शन & उपप्रोसेसर में रखा है। यह बहुत तेज़ है।

रास्ता एक मूल्य वापस पाने के लिए, एक पाइप बनाने के लिए उस पर एक मूल्य गूंज तो पाइप पढ़ा है:

mkfifo pipe 
moved=0 
# Use imageMagick 'compare' to find files with zero difference: 
comPare() { 
if [[ ! $(compare -metric AE $1 $2) ]]; then 
    mv $2 moved; 
    echo 1 > pipe; 
    else echo 0 > pipe 
    fi 
} 

# For every file in the dir, compare it to every other one: 
for file1 in $(ls *.bmp | head -n $(($(ls *.bmp | wc -l) - 1)); do 
for file2 in $(ls *.bmp | tail -n $(($(ls *.bmp | wc -l) - 1)); do 
    comPare file1 file2 & 
    moved=$(($(cat pipe) + 1)) 
done 
done 
rm pipe 
echo "Moved $moved files" 
(! चेतावनी निम्नलिखित कोड शायद काम नहीं करता है, यह सिर्फ एक काम कर पाइप से पता चलता)

अब तक एकमात्र समस्या यह है कि मैं एक यूएसबी ड्राइव पर काम कर रहा हूं, & अनुमतियां मुझे पाइप बनाने से रोक रही हैं। इसके अलावा ...

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