2012-02-05 11 views
9

Questo è il mio codice.Come fork() n processi figlio correttamente in C?

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
    int i, pid; 

for(i = 0; i < atoi(argv[1]); i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     printf("Child (%d): %d\n", i + 1, getpid()); 
     exit(0); 
    } else { 
     wait(NULL); 
    } 
} 

} 

L'uscita è così.

Child (1): 5676 
Child (2): 4624 
Child (3): 4800 
Child (4): 5596 
Child (5): 5580 

Tuttavia questo non è l'uscita aspettare nel mio lavoro. Dovrebbe essere così. Cosa c'è di sbagliato nel codice? Qualcuno può aiutarmi?

Child (2): 4625 
Child (1): 4624 
Child (3): 4626 
Child (4): 4627 
Child (5): 4628 

Grazie per il vostro aiuto. Ora lo proverò.

P.S. Scusa, il mio inglese non è buono. Spero tu possa capire quello che ho detto.

risposta

3

Il tuo codice funziona perfettamente sul mio computer. Può essere dipendente dal sistema operativo.

tuttavia è necessario verificare se argc non è uguale a 1 per evitare errori di segmentazione se non vengono forniti argomenti al programma.

+0

Grazie per il suggerimento. –

+0

Sì, è davvero dipendente dal sistema operativo. Ho testato il mio programma nel server Linux della scuola. Ho ottenuto l'uscita prevista. Grazie mille. –

1

Il sistema accetta PID gratuiti da assegnare ai processi. È possibile inserire il processo ID'd 4000 e avere un ID figlio di 3900. La carta dei compiti a casa non deve nemmeno inserire numeri perché il primo ID processo non è mai lo stesso.

+0

Grazie. Avevo fornito una descrizione del programma che includeva i miei compiti. Per favore aiuto. –

1

Il motivo per cui si ottiene un output non ordinato è che non è possibile prevedere esattamente quale figlio diventa attivo quando. Quindi potrebbe succedere che l'esecuzione del tuo primo figlio sia ritardata fino a quando il tuo secondo è fork() ed è stato avviato.

Normalmente i figli ricevono PID sequenziali, anche se dipende dal sistema operativo.

Entrambi i problemi non dovrebbero essere un problema con l'attività pianificata - né i PID assoluti sono davvero importanti (come detto, ogni SO può fare le proprie cose, assegnare PID in modo sequenziale o casuale), né l'ordine in cui il i bambini fanno le loro cose: ogni parte del bambino può avere tempi di esecuzione diversi, con conseguente output non ordinato. Questo conta fino a quando i dati vengono trasferiti correttamente - che è il caso se il genitore genera la sequenza e quindi biforca. In questo caso, il layout di memoria del processo figlio è uguale a quello del genitore al momento del fork. Quindi il genitore può modificare il suo "array di trasferimento dati" senza influire sui bambini già in esecuzione.

Per ridurre la confusione, è possibile rimuovere l'emissione di PID in ogni riga. Forse possono essere emessi al rispettivo inizio del processo figlio, ma dopo ciò dovrebbe essere sufficiente per dire ad es. Child 3: straight length 6 <S6,H5,C4,S3,H2,SA> senza ripetere il PID.

+0

Grazie. Avevo fornito una descrizione del programma che includeva i miei compiti. Per favore aiuto. –

+1

Non solo l'assegnazione pid dipende dal sistema operativo, la pianificazione dei processi figli dipende dal tempo di esecuzione; non vi è alcuna garanzia che il primo figlio a forcella sia il primo figlio pianificato per l'esecuzione. – tbert

+0

@tbert Exactl è quello che voglio dire con la "prima" sezione della mia risposta, quella che menziona le previsioni. – glglgl

1

Con tale risultato previsto, molto probabilmente i compiti dovrebbero prima sborsare tutti i processi e quindi chiamare l'attesa.

semplicemente ignorare la chiamata di attesa nel ciclo e fare uno separato sotto che deve essere ripetuto fino a quando wait rendimenti -1 e errno insieme a ECHILD. Si noti che l'ordine di uscita dei bambini sarà casuale, o almeno non completamente in ordine, quindi non necessariamente 2 1 3 4 5.

Questa è solo un'ipotesi, tuttavia, è necessario fornire maggiori informazioni se si desidera un altro risposta specifica

+0

Grazie. Avevo fornito una descrizione del programma che includeva i miei compiti. Per favore aiuto. –

Problemi correlati