2010-01-27 11 views
6

El programa calcula la suma de números de 1 a N .. El proceso hijo calcula la suma de números EVEN. El proceso principal calcula la suma de los números impares. Deseo obtener el valor de retorno del proceso secundario en el proceso principal. ¿Cómo hago eso¿Cómo obtener el valor de retorno de 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; 
} 

Pls dígame cómo consigo el valor de retorno del proceso del niño?

Respuesta

9

Lo que está buscando es wait() o waitpid().

+0

¿Cómo lo uso en realidad? No puedo obtenerlo De hecho, es la primera vez que escribo un programa fork() ... pls help –

+0

En la llamada principal waitpid (-1, & status, 0); –

+3

después, printf ("estado devuelto:% d", WEXITSTATUS (estado)); ... –

1

Como dtmilano dijo que debería usar wait o waitpid, según sea necesario.

Pero tal vez deberías dividir tu programa en dos partes y ejecutar el hijo con el ejecutor. Cuando hagas que fork tu proceso hijo, recibir pid sea igual a 0 y no sé si tratas de esperar las señales de proceso con pid 0 funcionará bien.

De todos modos puede pasar, aunque no es la mejor manera, el valor calculado por su hijo proceso a través de la salida.

1

Si desea conservar el valor de retorno para indicar un estado de salida correcto o fallido, puede llamar al pipe(2) antes de horquillar para configurar un canal separado entre padre e hijo.

2

¡Vaya! Esto no es bash! De todos modos ...

El motivo para engendrar un proceso es continuar el flujo principal, haciendo algo mientras tanto eso no afecta eso. Estoy ejecutando directorios de 10k imágenes, & moviendo duplicados. Puse el código de comparación en una función & subproceso que. Es muy rápido.

La manera de obtener un valor de vuelta es la creación de una tubería, echo un valor en ese entonces leer la tubería: (Advertencia el siguiente código probablemente no funciona, sólo se muestra un tubo de trabajo)

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" 

El único problema hasta ahora es que estoy trabajando en una unidad usb, los permisos & me impiden crear la tubería. Aparte de eso ...

Cuestiones relacionadas