# Fork, Wait, Exec

## Realnot

Salve, qualcuno e' cosi' gentile da spiegarmi l'output di questa porzione di codice? https://gist.github.com/anonymous/5435319 non riesco a capire perche' mi ritorna

```
uno

due

Mon Apr 22 15:48:45 CEST 2013

ret: 0 0

ret: 768 3
```

Fino alla riga 4 ci sono, ma poi non capisco perche' la riga 5 (ret: 768 3) ritorna quei valori dalla riga 15 del sorgente in relazione alla exit().

Forse sono off-topic, in tal caso mi scuso.

----------

## pierino_89

 *Realnot wrote:*   

> Salve, qualcuno e' cosi' gentile da spiegarmi l'output di questa porzione di codice? https://gist.github.com/anonymous/5435319 non riesco a capire perche' mi ritorna
> 
> ```
> uno
> 
> ...

 

Beh, prima esce la fork che è stata rimpiazzata dal comando "date", il quale è uscito con exit status 0 e dunque appare 0.

Dopodiché esce l'altra fork, facendo exit(3) ovviamente come exit status ha 3.

Stampare "ret" non ti serve a niente dal momento che è una variabile da processare: con WEXITSTATUS() ottieni lo stato di uscita, con WTERMSIG() il segnale che ha causato l'uscita, ecc...

Ricordati che in un programma reale dovresti uscire da un child con _exit() e non con exit(), o potresti avere dei problemi   :Wink: 

 *Quote:*   

> Forse sono off-topic, in tal caso mi scuso.

 

Probabilmente era meglio nel forum di discussione, magari chiedi a un moderatore se può spostare   :Wink: 

----------

## ago

 *pierino_89 wrote:*   

> Probabilmente era meglio nel forum di discussione, magari chiedi a un moderatore se può spostare  

 

Si può sempre fare un report quando si vede qualcosa che è errato

----------

## pierino_89

Giusto, scusa ma ieri ero un po' fuso   :Smile: 

----------

## Realnot

Ciao, scusa per il ritardo, ci sono, non capisco che diavolo e' quel 738...

----------

## pierino_89

 *Realnot wrote:*   

> Ciao, scusa per il ritardo, ci sono, non capisco che diavolo e' quel 738...

 

Te l'ho detto poco fa:

 *Quote:*   

> Stampare "ret" non ti serve a niente dal momento che è una variabile da processare: con WEXITSTATUS() ottieni lo stato di uscita, con WTERMSIG() il segnale che ha causato l'uscita, ecc...

 

"ret" è un numero binario in cui i diversi gruppi di bit hanno un significato specifico (ad esempio gli 8 bit meno significativi contengono l'exit status). Come puoi facilmente immaginare, una volta convertito in decimale questo numero non ha più assolutamente alcun senso (a meno che tu non sappia calcolare a mente quali sono gli 8 bit meno significativi di 738).

Leggiti questo per avere un'idea dei dati che puoi estrarre da quel valore:

http://digilander.libero.it/uzappi/C/librerie/funzioni/wait.html

----------

## Realnot

Ok capito, l'esercizio in questione non presupponeva di sapere cio'... ad ogni modo grazie per il chiarimento  :Smile: 

----------

## pierino_89

 *Realnot wrote:*   

> Ok capito, l'esercizio in questione non presupponeva di sapere cio'... ad ogni modo grazie per il chiarimento 

 

Guarda, ti consiglio di leggere in modo maniacale la documentazione di ogni comando perché spesso ci sono delle sottigliezze che ti fregano... Ho dato un esame di C non troppo tempo fa e se non mi fossi spulciato il man, l'info e la documentazione online non l'avrei mai passato   :Wink: 

----------

## Realnot

Certo, questo qui' era semplicemente un esercizio di sistemi operativi, una porzione di codice su un pezzo di carta... non avrei mai scritto 738 nell'ultima riga. Sono arriavato a casa, ho provato a farlo girare ed appena ho visto il 738 sono entranto in stallo (tanto per rimanere in tema)  :Razz: 

----------

