Oppure

Loading
15/02/13 18:53
Dante.cpp
Ho trovato questo programma esempio su internet, e leggendolo mi son sorti dei dubbi...

#include <stdio.h>
#include <unistd.h>
int main()  
{
  int pid;
  int status;

  printf (“Sono il processo padre, il mio PID è %d\n”, getpid());

  // Genero un nuovo processo
  pid=fork();
  
  if (pid==­1)  
    // ERRORE! Non è stato possibile creare il nuovo 

  if (pid==0) 
  {
    // In questo caso la fork() ha ritornato 0, quindi qui ci scrivo il codice del figlio
    printf (“Sono il processo figlio di %d, il mio PID è %d\n”, getppid(), getpid());
    exit(0);
  }

  if (pid>0)  
  {
    // In questo caso la fork() ha ritornato un valore maggiore di 0, quindi qui scrivo il codice del processo padre
    printf (“Sono il processo padre e ho generato un processo figlio\n”);
    // Attendo che il processo figlio venga terminato, e salvo il suo valore di ritorno nella variabile status

    while ((pid=wait(&status)>0);
    // Dal valore di status ricavo il valore di ritorno del processo figliostatus = (status & 0xFF) >> 8;

  printf (“Il processo %d è terminato con status %d\n”, pid, status);
  }
}


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?

aaa
15/02/13 21:30
pierotofy
No, i commenti nel sorgente sono poco chiari:

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: piero.dev
15/02/13 21:38
Bonny
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.. !!
aaa
15/02/13 23:00
Dante.cpp
I understand!
aaa
16/02/13 11:14
Dante.cpp
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?
aaa
17/02/13 13:20
Bonny
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.
aaa
17/02/13 16:36
Dante.cpp
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 17/02/13 16:57
aaa
17/02/13 16:58
Bonny
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:
aaa