2010-01-27 41 views
6

Chương trình tính tổng các số từ 1 đến N .. Quy trình con tính tổng số EVEN. Quy trình gốc tính toán tổng số lẻ. Tôi muốn nhận được giá trị trả lại của quá trình con trong quá trình cha mẹ. Làm thế nào để tôi làm điều đóLàm thế nào để nhận được giá trị trả lại từ TRÌNH TRẺ EM?

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

Xin vui lòng cho tôi biết làm thế nào để có được giá trị trở lại của quá trình con?

Trả lời

9

Những gì bạn đang tìm kiếm là wait() hoặc waitpid().

+0

Tôi thực sự sử dụng nó như thế nào? Tôi không thể làm được. Trên thực tế, đây là lần đầu tiên tôi viết một chương trình nĩa() ... xin giúp –

+0

Trong cuộc gọi phụ huynh waitpid (-1, & status, 0); –

+3

sau đó, printf ("trạng thái được trả về:% d", WEXITSTATUS (trạng thái)); ... –

1

Giống như dtmilano, bạn nên sử dụng chờ hoặc chờ đợi, tùy theo nhu cầu.

Nhưng có thể bạn nên chia chương trình của mình thành hai phần và thực thi con trai bằng lệnh exec. Khi bạn thực hiện ngã ba quá trình con của bạn nhận được pid bằng 0 và tôi không biết nếu bạn cố gắng chờ đợi tín hiệu của quá trình với pid 0 sẽ làm việc tốt.

Dù sao bạn có thể vượt qua, dù đó không phải là cách tốt nhất, giá trị được tính toán bởi quá trình con của bạn thông qua thoát.

1

Nếu bạn muốn giữ lại giá trị trả lại để báo hiệu trạng thái thoát thành công hoặc thất bại, bạn có thể gọi pipe(2) trước khi tìm cách thiết lập kênh riêng giữa cha mẹ và con.

2

Rất tiếc! Đây không phải là bash! Dù sao ...

Lý do sinh sản một quy trình là tiếp tục dòng chảy chính, làm điều gì đó trong khi đó không ảnh hưởng đến điều đó. Tôi đang chạy qua các thư mục hình ảnh 10k, & di chuyển các bản sao. Tôi đặt mã so sánh trong hàm & subprocess đó. Nó rất nhanh.

Cách để có được một giá trị lại là tạo ra một đường ống, echo một giá trị vào mà sau đó đọc các ống: (! Warning đoạn mã sau có thể không hoạt động, nó chỉ cho thấy một đường ống làm việc)

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" 

Vấn đề duy nhất cho đến nay là tôi đang làm việc trên một ổ đĩa USB, & quyền ngăn tôi tạo đường ống. Ngoài ra ...

Các vấn đề liên quan