Restituzione valori dopo fork

di il
5 risposte

Restituzione valori dopo fork

Salve a tutti.
Mi sono appena registrato per chiedervi una mano in un programma in C che sto scrivendo in ambiente Linux.
Ho 2 funzioni. La prima funzione (il main) si "forka" e richiama come figlio la seconda funzione (movement) con 2 parametri passati per valore. La seconda funzione accetta questi parametri, li modifica e li dovrebbe restituire al padre. Ma come faccio? Anche passando i valori per indirizzo (quindi "int *smotorpos" e "int *sonarpos") il main non riesce a leggere più questi valori perchè il suo processo figlio è appunto "forkato" dal padre.

int movement(int smotorpos, int sonarpos){
   /*... codice che modifica i 2 parametri...*/

   /*ritorno nuovi valori di smotorpos e sonarpos (ma non so come)*/
}

int main(){
   int smotorpos=0;
   int sonarpos=0;
   printf("VECCHIA Posizione motore stepper: %d\n",smotorpos);
   printf("VECCHIA Posizione sonar: %d\n",sonarpos);

   int movementchildpid=fork();
   if(movementchildpid==0){
      movement(smotorpos,sonarpos);
   }else{
      wait(NULL);
      /*recupero nuovi valori di smotorpos e sonarpos (ma non so come)*/
      printf("NUOVA Posizione motore stepper: %d\n",smotorpos);
      printf("NUOVA Posizione sonar: %d\n",sonarpos);
   }
}

Vi ringrazio anticipatamente per l'aiuto che mi darete

5 Risposte

  • Re: Restituzione valori dopo fork

    alessiox.94 ha scritto:


    Salve a tutti.
    Ho 2 funzioni. La prima funzione (il main) si "forka" e richiama come figlio la seconda funzione (movement) con 2 parametri passati per valore. La seconda funzione accetta questi parametri, li modifica e li dovrebbe restituire al padre. Ma come faccio? Anche passando i valori per indirizzo (quindi "int *smotorpos" e "int *sonarpos") il main non riesce a leggere più questi valori perchè il suo processo figlio è appunto "forkato" dal padre.
    Non puoi restituire i due valori perché la fork crea una copia del processo e viene distrutta in chiusura.
    Se fosse un solo valore naturalmente potresti restutuirlo con exit(n), ma nel tuo caso specifico o usi dei trucchi tipo forkare due volte con due exit (un po bruttino) o usare una sezione sharata.
  • Re: Restituzione valori dopo fork

    Uhm... l'avevo supposto che non si potesse fare... mi servirebbe una magica "exit(a,b,....z)" che ovviamente non esiste. Non posso forkare 2 volte il processo perchè i valori vengono modificati contemporaneamente e quindi contemporaneamente devono essere restituiti. Visto che questi valori li devo in seguito salvare in un file, proverò a salvarli direttamente nella funzione "movement" (anche se poi il padre sarà costretto a rileggerli dal file... peccato
    Grazie comunque
  • Re: Restituzione valori dopo fork

    alessiox.94 ha scritto:


    Visto che questi valori li devo in seguito salvare in un file, proverò a salvarli direttamente nella funzione "movement" (anche se poi il padre sarà costretto a rileggerli dal file... peccato
    E' logico che sia così, ogni processo si chiude con un solo codice di exit. Come detto precedentemente puoi usare la memoria sharata se non vuoi salvare su file.

    Ciao
  • Re: Restituzione valori dopo fork

    Scusami per la risposta tardiva ma trovare tempo per il mio hobby è difficile.
    Alla fine mi hai convinto . Ho usato la shared memory e adesso riesco a scambiare i 2 interi fra le 2 funzioni. Ovviamente i valori li ho inseriti in un array di interi.
    
    #include <sys/ipc.h>
    #include <sys/shm.h>
    
    void movement(int *pos){
       //codice che modifica i 2 interi ovvero pos[0] e pos[1].
    }
    
    int main(){
       int memd;
       int *pos;
       memd=shmget(IPC_PRIVATE, sizeof(int)*2, SHM_R | SHM_W | IPC_CREAT | IPC_EXCL);
       pos=(int *)shmat(memd, 0, SHM_R | SHM_W);
       pos[0]=0; //stepper motor position
       pos[1]=0; //sonar motor position
       printf("VECCHIA Posizione motore stepper: %d\n",pos[0]);
       printf("VECCHIA Posizione sonar: %d\n",pos[1]); 
       //... ...
       movementchildpid=fork();
       if(movementchildpid==0){
          movement(pos);
       }else{
          wait(NULL);
          printf("NUOVA Posizione motore stepper: %d\n",pos[0]);
          printf("NUOVA Posizione sonar: %d\n",pos[1]); 
       }
    }
    
    Questo metodo di IPC non lo avevo mai applicato, adesso grazie a te so come utilizzarlo
  • Re: Restituzione valori dopo fork

    e adesso riesco a scambiare i 2 interi fra le 2 funzioni.
    tra i 2 processi
    Questo metodo di IPC non lo avevo mai applicato, adesso grazie a te so come utilizzarlo
    Devi ringraziare te stesso che ti sei applicato e sei riuscito a farlo da solo e senza aiuti

    Ciao,
    Max
Devi accedere o registrarti per scrivere nel forum
5 risposte