Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - My first program multiprocess
Forum - C/C++ - My first program multiprocess

Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 19:53
Venerdì, 15/02/2013
Ho trovato questo programma esempio su internet, e leggendolo mi son sorti dei dubbi...

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. int main()  
  4. {
  5.   int pid;
  6.   int status;
  7.  
  8.   printf (“Sono il processo padre, il mio PID è %d\n”, getpid());
  9.  
  10.   // Genero un nuovo processo
  11.   pid=fork();
  12.  
  13.   if (pid==­1)  
  14.     // ERRORE! Non è stato possibile creare il nuovo
  15.  
  16.   if (pid==0)
  17.   {
  18.     // In questo caso la fork() ha ritornato 0, quindi qui ci scrivo il codice del figlio
  19.     printf (“Sono il processo figlio di %d, il mio PID è %d\n”, getppid(), getpid());
  20.     exit(0);
  21.   }
  22.  
  23.   if (pid>0)  
  24.   {
  25.     // In questo caso la fork() ha ritornato un valore maggiore di 0, quindi qui scrivo il codice del processo padre
  26.     printf (“Sono il processo padre e ho generato un processo figlio\n”);
  27.     // Attendo che il processo figlio venga terminato, e salvo il suo valore di ritorno nella variabile status
  28.  
  29.     while ((pid=wait(&status)>0);
  30.     // Dal valore di status ricavo il valore di ritorno del processo figliostatus = (status & 0xFF) >> 8;
  31.  
  32.   printf (“Il processo %d è terminato con status %d\n”, pid, status);
  33.   }
  34. }



Allora pid è l'identificativo del nuovo processo generato dalla chiamata a fork(),  la riga 16 afferma che il figlio ha sempre il pid=0, mentre il padre lo ha sempre >0; quindi ogni padre puo avere solo un figlio?


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:30
Venerdì, 15/02/2013
No, i commenti nel sorgente sono poco chiari:

Testo quotato


       On success, the PID of the child process is returned in the parent, and 0 is returned in the  child.   On
       failure, -1 is returned in the parent, no child process is created, and errno is set appropriately.



Il padre ha un suo PID, così come il figlio ha un suo PID (entrambi != 0). 0 viene ritornato da fork per poter permettere al processo figlio di sapere che è stato forkato, ma il suo vero pid è dato da getpid().


Il mio blog: https://piero.dev
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 22:38
Venerdì, 15/02/2013
No, può avere molti figli... il fatto che il pid sia uguale a 0 è una convenzione, cioè in questo caso il figlio vede pid == 0.. vediamo se riesco a spiegarti, vediamo cosa succede:

per esempio il pid del processo (padre) che effettua la fork() sia 123 -> getpid();

il processo esegue la fork()
crea un processo figlio con pid == 456

a questo punto il processo 123 continua ad eseguire le successive istruzioni..
il processo figlio 456 parte ad eseguire le istruzioni successive alla chiamata fork()

il processo figlio nel proprio spazio di indirizzamento vede pid = 0 ed entra nel primo if

il processo padre vede che pid == 456 ovvero > 0 ed entra nel secondo if

Cioè il figlio "eredita" la variabile pid dal padre, perchè la fork() fa una copia del processo ma pid viene posta a 0

spero di essermi spiegato.. !!

PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 0:00
Sabato, 16/02/2013
I understand!

PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 12:14
Sabato, 16/02/2013
Devo creare un poccolo giochino per scuola, utilizando le librerie grafiche Gtk+. Sta di fatto che non amo la gestione degli eventi offerta da queste librerie, quindi pensavo di creare un processo per la grafica e un'altro per il motore di gioco. Secondo voi è una buona idea?

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 14:20
Domenica, 17/02/2013
Leggi qualche tutorial e cerca di farlo mediante la gestione degli eventi offerta da gtk.
Si tratta solo di implementare dei metodi/funzioni che eseguono il codice al loro interno quando si scatena l'evento al quale sono associate.

PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 17:36
Domenica, 17/02/2013
Gia, cio che non mi garba, è la mole di dati che devo passare a queste funzioni, tra cui matrici! Non so, forse dovrei usare qualche globale...

Ultima modifica effettuata da Dante.cpp il 17/02/2013 alle 17:57
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 17:58
Domenica, 17/02/2013
Non fasciarti la testa ancor prima di romperla!!!!

Provaci, aggredisci il codice :)

Inizia a sviluppare qualcosa.. successivamente poi postare le problematiche che incontri.. e magari qualcuno ti aiuta nel ragionamento o ti spiega come usare una funzione o algoritmo specifico..

Provaci vedrai che ci riesci :k:

PM Quote
Avatar
Dante.cpp (Normal User)
Pro


Messaggi: 65
Iscritto: 23/11/2011

Segnala al moderatore
Postato alle 18:16
Domenica, 17/02/2013
L'ho gia fatto, semplicemente non mi soddisfa!

PM Quote