Domanda

Dobbiamo dire il risultato del seguente programma C:

main()
{
    int pid, k, som;
    som = 0; k = 2;
    pid = fork();
    if(pid == 0)
        k=5;
    else
        wait(0);
    for(int i = 1; i <= k; i++)
        som += i;
    printf("%d", som);
}

La mia prima aspettativa è 3. Quando viene effettuata una chiamata fork, la memoria del processo viene copiata ed entrambi i programmi vengono eseguiti. Quindi il processo figlio viene eseguito, ma k è ancora uguale a 2. Quindi alla fine, esegue 1 + 2 = 3;

Ma quando questo programma viene eseguito, genera 153. Non ho la più pallida idea del perché lo produca.

Qualcuno può dire perché?

È stato utile?

Soluzione

Il motivo per cui hai 2 processi di stampa sulla stessa console. & Quot; forcella " è un comando unix / linux che viene chiamato una volta e ritorna due volte. Uno dei ritorni sarà nel processo originale che ha chiamato fork e restituirà il PID del processo figlio generato. Il secondo ritorno sarà 0 e questo indica che è il processo figlio.

Uno dei programmi, credo, il bambino esegue per primo e calcola 15 come valore e lo stampa per ultimo sulla console. Il programma padre viene eseguito secondo a causa dell'attesa (0) e produce il valore 3.

Altri suggerimenti

15 è stampato dal bambino e 3 dal genitore.

A è il genitore, B è il figlio, ecco le linee importanti:

A: pid = fork(); // returns 0 for the child process
A: wait(0);
B: k = 5;
B: for(int i = 1; i <= k; i++) som += i; // som = 15
B: printf("%d", som); // prints 15, B finishes, goes back to A
A: for(int i = 1; i <= k; i++) som += i; // som = 3
A: printf("%d", som); // prints 3

Non è stata stampata una nuova riga tra i valori, quindi la risposta del genitore appare subito dopo la risposta del bambino.

Jared ha ragione sulla causa dei valori.

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