Domanda

So quello che il fork () non al livello superiore. Quello che mi piacerebbe sapere è questa -

  1. Appena c'è una chiamata fork, un'istruzione trappola segue e controllo passa ad eseguire la forcella "gestore". Ora, come questo gestore, che crea il processo figlio, duplicando il processo padre con la creazione di un altro blocco spazio di indirizzamento e controllo di processo, tornare 2 valori, uno per ogni processo?

  2. A che punto dell'esecuzione fa 2 valori ritorno forcella?

Per dirla in breve, anbody può spiegare gli eventi passo-passo che si svolgono al livello inferiore dopo una chiamata fork?

È stato utile?

Soluzione

Non è così difficile a destra - la parte kernel del syscall fork () può dire la differenza tra i due processi attraverso il processo Control Block come lei ha ricordato, ma non hanno nemmeno bisogno di farlo. Così il pseudocodice appare come:

int fork()
{
    int orig_pid = getpid();

    int new_pid = kernel_do_fork();     // Now there's two processes

    // Remember, orig_pid is the same in both procs
    if (orig_pid == getpid()) {
        return new_pid;
    }

    // Must be the child
    return 0;
}

Modifica La versione ingenua fa proprio come lei -. Crea un contesto nuovo processo, le copie di tutti i contesti filo associati, le copie di tutte le pagine e le mappature dei file e il nuovo processo è messo in "pronto per l'esecuzione" lista

Credo che la parte che stai ottenendo confuso su è, che quando questi processi riprendono (vale a dire quando i rendimenti genitore da kernel_do_fork, e il bambino è prevista per la prima volta), si avvia in centrale della funzione (cioè di esecuzione la prima 'se'). Si tratta di un esattamente copia - entrambi i processi eseguiranno 2 ° tempo della funzione.

Altri suggerimenti

Il valore restituito ad ogni processo è diverso. Il / originale get filo genitore il PID del processo figlio e del get processo figlio 0.

Il kernel di Linux raggiunge questo su x86 modificando il valore nel registro EAX come copia l'attuale thread nel processo padre.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top