2010-01-27 53 views
6

程序計算從1到N的數字總和。 子進程計算偶數的總和。父進程計算奇數的和。 我想在父進程中獲取子進程的返回值。我該怎麼做如何從CHILD PROCESS中獲取返回值?

#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; 
} 

請告訴我如何獲得子進程的返回值?

回答

9

您要尋找的是wait()waitpid()

+0

我該如何使用它?我無法得到它。其實它第一次寫了一個fork()程序... 請幫忙 – 2010-01-27 13:45:27

+0

在父調用waitpid(-1,&status,0); – 2010-01-27 14:14:02

+3

之後, printf(「status returned:%d」,WEXITSTATUS(status)); ... – 2010-01-27 14:30:17

1

像dtmilano說,你應該使用wait或waitpid,取決於或需要。

但是,也許你應該把你的程序分成兩部分,並用exec來執行子。當你讓fork你的子進程接收pid等於0,我不知道你是否試圖用pid 0等待進程的信號會正常工作。

無論如何,你可以通過,儘管這不是最好的方式,通過退出你的子進程計算的值。

1

如果要保留返回值以指示成功或失敗退出狀態,則可以在分支之前調用pipe(2)以在父級和子級之間設置單獨的通道。

2

糟糕!這不是bash!無論如何...

產卵過程的原因是繼續主要流程,做一些同時不影響的過程。我正在運行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" 

到目前爲止唯一的問題是,我正在使用USB驅動器,&權限阻止我創建管道。除此之外...