Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
Ho trovato questo programma esempio su internet, e leggendolo mi son sorti dei dubbi...
Codice sorgente - presumibilmente C++ |
#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?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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().
|
|
Bonny (Member)
Expert
Messaggi: 437
Iscritto: 24/04/2009
|
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.. !!
|
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
I understand!
|
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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?
|
|
Bonny (Member)
Expert
Messaggi: 437
Iscritto: 24/04/2009
|
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.
|
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
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 |
|
Bonny (Member)
Expert
Messaggi: 437
Iscritto: 24/04/2009
|
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
|
|
Dante.cpp (Normal User)
Pro
Messaggi: 65
Iscritto: 23/11/2011
|
L'ho gia fatto, semplicemente non mi soddisfa!
|
|