Output incerto

di il
6 risposte

Output incerto

Ciao. Potreste aiutarmi a capire questo codice?

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv)
{
printf("1\n");
if(fork()==0)
{
printf("2\n");
fork();
printf("3\n);
}
else 
wait();
printf("4\n");
L'esercizio mi chiede di indicare un possibile output... Io credo che 1-2-3-3-4-4 è una possibile soluzione, giusto? oppure 1-2-3-4-3-4 è un altro possibile output, dato che non è possibile stabilire quale processo verrà eseguito per prima. Dico bene?

6 Risposte

  • Re: Output incerto

    Direi che ti sei avvicinato molto con il primo : 123344 . in effetti dovrebbe essere: 1233444
  • Re: Output incerto

    Scusa perchè tre 4? :O
    Allora sull'1 non c'è dubbio.
    Sul 2 nemmeno perchè anche se parte prima il processo padre, questo deve attendere la terminazione del processo figlio prima di emettere 4. Quindi si entra per forza nel figlio, che stampa 2, poi il processo si "sdoppia", quindi stampa 3, poi il processo figlio mettiamo che termina, quindi il padre stampa 4, il processo figlio del processo figlio stampa il 3 e poi il 4. Dov'è l'errore?
  • Re: Output incerto

    Ma perché il figlio dovrebbe terminare? per quello che ho letto l'esercizio vuole un possibile output di quella porzione di codice. Dato che nel codice non vedo motivo per cui il figlio debba terminare prima, l'output dovrebbe essere proprio 1233444, infatti:
    - Viene stampato 1
    - con la if del fork il processo si sdoppia, quindi in totale ci sono 2 processi
    - ora il padre aspetta che un processo termini con la wait()
    - viene stampato 2
    - viene chiamata una fork, e qui viene a crearsi un altro processo, quindi ci sono 3 processi ora
    - il primo figlio (o il secondo) stamperà 3
    - il secondo figlio (o il primo) stamperà 3
    - entrambi i figli escono dall' if...then...else
    - il primo figlio (o il secondo) stampa 4
    - il secondo figlio (o il primo) stampa 4
    - adesso, indipendentemente che uno dei figli esca per primo, la wait() ritorna
    - il padre stampa 4
    - uscita del padre
    L'output che ho scritto non è sicuro, infatti se hai letto bene prima ho scritto 'dovrebbe' è non 'è', quindi nessuno dice che i tuoi output non siano corretti, anzi ti dirò, ce ne possono essere altri si output, perché:
    - se la seconda fork() restituisce -1, nessun processo è creato quindi ci sono solo 2 processi, in questo caso l'output potrebbe essere 12344
    - se la prima fork () restituisce -1, allora l'output risulta essere 14, sempre che la wait() ritorni
    Poi ovviamente ci sono eventuali uscite inaspettate da programma (signal ed eventuali) che possono ancora modificare l'output. Insomma, ci sono vari casi. Però, se si considera il caso normale, ovvero che nessun processo venga interrotto, e che tutti escano normalmente, allora l'output 'dovrebbe' essere quello che ti ho indicato prima.
  • Re: Output incerto

    Ma il 4, ora che leggo bene, dovrebbe coinvolgere solo il processo padre perchè i figli agiscono solo nelle fork()==0, cioè nel primo if. il 4 è al di fuori della parte dove fork==0, quindi solo il padre stampa 4. no?
  • Re: Output incerto

    Questo no. con la fork viene creata una copia del processo, quindi le istruzioni sono uguali in tutte, e dato che il 4 si trova fuori la condizione if...then...else, tutti la eseguono.
  • Re: Output incerto

    Ah ok, ora ho capito! Grazie mille
Devi accedere o registrarti per scrivere nel forum
6 risposte