|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
[c]Creare processi con la fork
Salve, ho un problema a far funzionare la fork per creare dei processi. Il mio scopo è avere il processo padre che crea 2 processi figli ognuno dei quali stampa una stringa. Ho scritto questo codice, in cui in un ciclo for il padre esegue la fork creando un figlio ad
ogni iterazione: Codice PHP:
ivece ottengo: Inizio Inizio Inizio uno due in qualche oridne. Come mai? Non riesco a capire questo output. Perche Inizio appare tre volte?
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 20-04-2004 alle 18:29. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Non hai fatto nessun errore, ma è...giusto così
Ti do un indizio: se sostituisci printf(..) con fprintf(stderr, ...) hai l'output desiderato
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Ma perche bisogna fare cosi? Perche stampa 3 volte Inizio?
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 20-04-2004 alle 19:03. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
La printf scrive su stdout, che è line-buffered. Ciò vuol dire che i caratteri vengono mantenuti in un buffer interno, fino a quando una riga è completa (il fine riga è il carattere '\n'). Avrai fatto caso, forse, che "inizio" viene stampato 3 volte, ma il '\n' prima di "inizio" viene stampato una sola volta.
Quindi, in soldoni: nel momento in cui fai il fork, sia il processo padre che il processo figlio ricevono una copia esatta di tutte le variabili, compreso il buffer di stdout e ciò che si trova dentro. Entrambi i processi, dunque, si ritrovano "Inizio" nella coda per stdout. Questo spiega il comportamento apparentemente assurdo.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Attenzione che non è garantito che ti stampi "Inizio uno due"...ma può stampare anche "Inizio due uno"...
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
Grazie sensine, ora ho capito quello che avviene, in effetti non capivo neanche perche gli accapo un po' c'erano e un po no
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Visto che mi trovo, come si fa a sincronizzare i processi?
In particolare io vorrei che il processo padre non termini prima dei fili. Ho uilizzato subito dopo la fork l'istruzione wait(...) che mette in attesa un processo finche non è terminato uno dei figli, quindi il padre dovrebe attendere la terminazione dell'unico figlio generato nel ciclo for prima di andare avanti generando un altro figlio. Pero quello che accade è che il padre termina comunque prima. Come dovrei fare allora per realizzare quello che voglio?
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
La sincronizzazione dei processi è un argomento molto vasto e complesso. Nel tuo specifico caso ecco un esempio:
Codice:
/* USO DELLA FORK CON WAIT: fork-wait.c */
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
main()
{
int i,n,w;
n = fork();
if (n == -1)
{
fprintf(stderr,"fork fallita\n");
exit(1);
}
else
if ( n == 0) /* processo figlio */
{
printf("\n(figlio) il mio process-id e` %d\n",getpid());
printf("\n(figlio) ora aspetto 5 secondi\n");
for (i=0; i<5; i++)
{
system("sleep 1");
printf(".\n");
}
printf("(figlio) ho finito e muoio\n");
exit(0);
}
else /* processo padre */
{
printf("\n(padre) il mio process-id e` %d\n",getpid());
printf("\n(padre) ora aspetto il figlio\n");
w = wait(0);
printf("\n(padre) sono uscito dalla wait muoio anch'io\n");
exit(0);
}
}
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
Ti consiglio di approndire i discorsi sulla wait e sulle altre system call (signal, kill,exec) oltre che sui semafori, la memoria condivisa e le code di messaggi cercando in rete. Un ottimo link per la gestione dei processi link è http://www.lilik.it/~mirko/gapil/gap...tml#x69-450003
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:40.



















