fork, przekazywanie wyniku obliczeń

0

Napisz program z wykorzystaniem rozwidlenia gdzie potomek doda dwie wartości a proces macierzysty pomnoży te wartosci i wyświetli różnice pomiędzy tymi wynikami (suma i iloczynem)

#include<stdlib.h>
#include<stdio.h>
#include<wait.h>
int main(int argc,char **argv)
{
int a,b,suma,iloczyn;
int roznica;
   printf("Wpisz liczby \n");
   scanf("%d%d",&a,&b);
   printf(" a=%d \n",a);
   printf(" b=%d \n",b);

   pid_t id =fork();

   if(id==0)
   {
     printf("PDI:%d- jestem procesem potomnym \n",id);
     suma=a+b;
     printf("Suma a+b wynosi %d\n",suma);
     printf("PDI:%d-proces potomny konczy...\n",id);
   }
     else
     {
     int status=210;
       printf("PDI:%d -jestem procesem macierzystym \n",id);
       iloczyn=a*b;
       printf("Iloraz a*b wynosi %d\n",iloczyn);

        id = waitpid(id,&status ,0);

       printf("PDI:%d -proces potomny skonczyl i zwrocil status:%d\n",id,WEXITSTATUS(status));

       roznica = suma-iloczyn;
       printf("Roznica suma-iloczyn wynosi %d\n ",roznica);
       printf("PDI:%d -proces macierzysty konczy...\n",id);

      }

      return EXIT_SUCCESS;
}

Moj problem polega na tym ze w procesie macierzystym roznica wychod nie taka jaka powinnaa

0
SYNOPSIS
       #include <sys/types.h>
       #include <sys/shm.h>

       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);
 
0

Można prościej niż pamięcią dzieloną (chociaż jest to takie-sobie).

Problem jest taki, że w żaden sposób nie odbierasz danych od procesu potomnego (użycie z "nadzieją" zmiennych globalnych sugeruje, że nie wiesz/nie pamiętasz że każdy proces ma swój własny segment danych).
Więc proces macierzysty po prostu nie jest świadom wartości zmiennej "suma" obliczonej przez proces potomny.

No ale - można te dane zwrócić przez exit(STATUS), bo później i tak odbierasz wartość statusu w procesie macierzystym. Voila - odebrałeś wykonane obliczenia - teraz ich użyj :).

0

Ale kombinujecie, jak shared mem to od razu semafory by się przydały. Ale nie lepiej wtedy użyć wygodniejszego API shm_open zamiast shmget (POSIX vs SystemV, do wygooglania). Tylko po co?
Prawie że gotowiec jest tutaj: http://linux.die.net/man/2/pipe i tutaj: man 2 pipe

@xfin można i po Twojemu, ale klasycznie aplikacja zwraca 0 jak się zakończyła prawidłowo, to trochę narusza konwencję. Możnaby chyba także użyć sigaction (nie signal, tylko sigaction z wieloparametrowym handlerem) i kill ale to droga dookoła ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1