2012-02-19 15 views
6

Considerando il codice qui sotto:valore restituito sistema vfork() call

int main() 
{ 
    int pid; 
    pid=vfork(); 
    if(pid==0) 
    printf("child\n"); 
    else 
    printf("parent\n"); 
    return 0; 
    } 

In caso di vfork() lo spazio indirizzo utilizzato da processo padre e processo figlio è stesso, così un'unica copia di variabile pid dovrebbe essere lì Ora non capisco come questa variabile pid possa avere due valori restituiti da vfork() cioè zero per figlio e non zero per genitore?

In caso di fork() lo spazio indirizzo viene anche copiato e ci sono due copia di variabili pid in ogni bambino e genitore, così posso capire in questo caso due copie diverse possono avere valori diversi restituito da forcella() ma non è possibile capire in caso di vfork() in che modo pid restituisce due valori da vfork()?

+2

Questo è letale - puoi 'exec()' o '_exit()' nel ['vfork()'] (http://pubs.opengroup.org/onlinepubs/009695399/toc.htm) 'd bambino ma questo è tutto. Praticamente qualsiasi altra cosa porta a comportamenti indefiniti. Raccomandazione: non usare ['vfork()'] (http://pubs.opengroup.org/onlinepubs/007908799/xsh/vfork.html); anzi, non mi preoccuperei nemmeno di imparare come usarlo in sicurezza. È come 'gets()', una funzione che è meglio fingere che non esista. –

+1

@JonathanLeffler: 'vfork()' è abbastanza utile per i sistemi senza MMU. – ninjalj

+0

Sì signore, sono d'accordo con voi non dovremmo usarlo, ma stavo usando vfork per risolvere un problema di creazione dell'albero del processo e della comunicazione tra i processi di diversi livelli di albero, in quel caso vfork era utile prendendo alcune variabili globali. Terrò un tuo consiglio. –

risposta

6

Non ci sono 2 copie. Quando si esegue il calle vfork il genitore si blocca mentre il bambino fa il suo lavoro (fino a quando non chiama _exit(2) o execve(2)). Quindi, in qualsiasi momento, c'è una sola variabile pid.

Come nota a margine, quello che stai facendo è pericoloso. The standard magie chiaramente:

vfork() funzione deve essere equivalente a fork(), eccetto che il comportamento è indefinito se il processo creato da vfork() sia modifica dati diversi da una variabile di tipo pid_t utilizzato per memorizzare il valore di ritorno da vfork(), o restituisce dalla funzione in cui è stato chiamato vfork(), oppure chiama qualsiasi altra funzione prima con successo chiamando _exit() o una della famiglia exec di funzioni.

Come seconda nota a margine, vfork è stato rimosso da SUSv4 - non c'è davvero alcun senso utilizzarlo.

+0

Significa che mentre usinng vfork il processo creato può modificare il valore di ** pid_t ** tipo variabile in modo tale che quando il figlio esce e il genitore riprende come o da chi viene ripristinato il valore precedente della variabile ** pid_t ** ?? ? –

+2

@ L.ppt Quando il padre continua "pid_t" memorizzerà il PID del bambino. – cnicutar

+2

@ L.ppt: il compilatore tratta specificamente una variabile 'pid_t' restituita da' vfork() '. È sempre su un registro e non si riversa nella memoria. – ninjalj