<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BAGG</id>
	<title>Sistemi Operativi - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://so.v2.cs.unibo.it/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BAGG"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/BAGG"/>
	<updated>2026-05-02T11:21:46Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_20-01-2015&amp;diff=1137</id>
		<title>Prova Teorica 20-01-2015</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_20-01-2015&amp;diff=1137"/>
		<updated>2015-06-01T12:03:34Z</updated>

		<summary type="html">&lt;p&gt;BAGG: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Es. c.1==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere il monitor lwlrbb. Il monitor deve implementare le seguenti procedure entry:&lt;br /&gt;
     - void write(generic_type val);&lt;br /&gt;
     - generic_type read(void);&lt;br /&gt;
&lt;br /&gt;
Il lwlrbb si comporta come un bounded buffer di MAX elementi che coordina l'attivita' di numerosi processi produttori/scrittori &lt;br /&gt;
e numerosi lettori/consumatori. lwlrbb ammette un numero massimo (sempre MAX) di lettori e scrittori in attesa.&lt;br /&gt;
&lt;br /&gt;
Se il buffer e' vuoto e ci sono piu' gia' MAX lettori in attesa, il lettore che e' in attesa da piu' tempo esce resituendo NULL.&lt;br /&gt;
&lt;br /&gt;
In ugual modo se il buffer e' completamente pieno e ci sono gia' MAX scrittori che attendono di scrivere viene perduto il valore che da&lt;br /&gt;
piu' tempo nel buffer attende di venir letto, il primo processo in attesa di scrivere puo' cosi' scrivere il suo elemento nel buffer e sbloccarsi.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di BAGG===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 42&lt;br /&gt;
&lt;br /&gt;
monitor lwlrbb {&lt;br /&gt;
    generic_type bb[] ;&lt;br /&gt;
    int count, front, rear ; 	/* rispettivamente: numero elementi, dove scrivere nel buffer, dove leggere nel buffer */&lt;br /&gt;
    int nw, nr ; 		/* rispettivamente numero di writer e reader */&lt;br /&gt;
    bool exit ; 		/* server ai reader per sapere se devono ritornare NULL al loro rientro nel monitor  */&lt;br /&gt;
    condition canr, canw ;&lt;br /&gt;
&lt;br /&gt;
    lwlrbb(void) {&lt;br /&gt;
        bb = new generic_type[MAX] ;&lt;br /&gt;
        count = front = rear = nw = nr = exit = 0 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry void write(generic_type val) {&lt;br /&gt;
        if(count == MAX) {			/* se count è MAX non si può scrivere  */&lt;br /&gt;
            if(nw == MAX) {			/* se la coda è piena devo fare spazio */	&lt;br /&gt;
                rear = (rear + 1)%MAX ;         /* rear indica il più vecchio elemento ancora da leggere, lo incremento --&amp;gt; salto l'elemento */&lt;br /&gt;
                count -= 1 ;&lt;br /&gt;
                nw += 1 ;			/* incremento prima perchè anche se la coda è piena ora dopo la signal ci sarà un posto...  */&lt;br /&gt;
                canw.signal() ;			/* ora il primo che aspettava può scrivere --&amp;gt; lo sveglio  */&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -= 1 ;&lt;br /&gt;
            } else {				/* se la coda non è piena devo comunque aspettare...  */&lt;br /&gt;
                nw += 1 ;&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -=1 ;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
	bb[front] = val ;					&lt;br /&gt;
        front = (front + 1)%MAX ;&lt;br /&gt;
        count += 1 ;&lt;br /&gt;
        canr.signal() ;				/* potrebbe esserci un reader che aspetta --&amp;gt; segnalo che ho scritto e si può leggere  */&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry generic_type read(void) {&lt;br /&gt;
        if(count == 0) {			/* se non c'è nulla da leggere allora devo aspettare  */&lt;br /&gt;
            if(nr == MAX) {			/* se la coda è piena setto exit, che i reader controllano per sapere se sono stati svegliati per ritornare NULL  */&lt;br /&gt;
                exit = 1 ;&lt;br /&gt;
                canr.signal() ;		        /* sveglio il condannato...  */&lt;br /&gt;
            } nr += 1 ;				/* mi accodo... */&lt;br /&gt;
            canr.wait() ;&lt;br /&gt;
            nr -= 1 ;&lt;br /&gt;
            if(exit) {				/* se sono il condannato resetto la variabile ed esco...  */&lt;br /&gt;
                 exit = 0 ;&lt;br /&gt;
                 return NULL ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        generic_type r = bb[rear] ;&lt;br /&gt;
        rear = (rear + 1)%MAX ;&lt;br /&gt;
        count -= 1 ;&lt;br /&gt;
        canw.signal() ;				/* ho letto, quindi si è liberato un posto e almeno un writer può scrivere... */&lt;br /&gt;
        return r ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1136</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1136"/>
		<updated>2015-05-31T10:30:49Z</updated>

		<summary type="html">&lt;p&gt;BAGG: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 20-01-2015]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 2 prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 30-05-11]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 14-02-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Pratica Es.2 12-02-2009]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 13-05-2011]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 16-07-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Pratica 20-02-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Pratica 02-07-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Buffer Limitato]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1-2 Prova Pratica 30-05-2012]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 25-09-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 30-05-2012]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 23-06-09]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 25-09-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 20-06-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 29-05-14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 2 esame 29/05/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Grep piramidale (non tanto grep) esame 2.7.2003]]&lt;br /&gt;
&lt;br /&gt;
[[Ricerca e stampa MD5checksum (Prova pratica 21-01-2015)]]&lt;br /&gt;
&lt;br /&gt;
[[Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)]]&lt;br /&gt;
&lt;br /&gt;
[[Aggiorna cartelle (Prova pratica 23-01-2014)]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 prova pratica 29 maggio 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 12-09-11]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 25-01-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 22-06-2011]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica, 18-07-2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica, 17-07-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica, 23-01-2014]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica Esercizio 3 esami 17_07_12 - 17_06_14 - 19_07_10]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 23_01_14]]&lt;br /&gt;
&lt;br /&gt;
[[Albero binario 2002-07-23]]&lt;br /&gt;
&lt;br /&gt;
[[50 Sfumature di Fibonacci]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 20/06/12]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 17/06/14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 17 07 14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.01.2015]]&lt;br /&gt;
&lt;br /&gt;
[[bash scripting 2002 gennaio]]&lt;br /&gt;
&lt;br /&gt;
[[Process Race (Prova pratica 18-07-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_20-01-2015&amp;diff=1135</id>
		<title>Prova Teorica 20-01-2015</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_20-01-2015&amp;diff=1135"/>
		<updated>2015-05-31T10:29:08Z</updated>

		<summary type="html">&lt;p&gt;BAGG: Soluzione di Cristiano Piemontese all'esercizio c.1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Es. c.1==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere il monitor lwlrbb. Il monitor deve implementare le seguenti procedure entry:&lt;br /&gt;
     - void write(generic_type val);&lt;br /&gt;
     - generic_type read(void);&lt;br /&gt;
&lt;br /&gt;
Il lwlrbb si comporta come un bounded buffer di MAX elementi che coordina l'attivita' di numerosi processi produttori/scrittori &lt;br /&gt;
e numerosi lettori/consumatori. lwlrbb ammette un numero massimo (sempre MAX) di lettori e scrittori in attesa.&lt;br /&gt;
&lt;br /&gt;
Se il buffer e' vuoto e ci sono piu' gia' MAX lettori in attesa, il lettore che e' in attesa da piu' tempo esce resituendo NULL.&lt;br /&gt;
&lt;br /&gt;
In ugual modo se il buffer e' completamente pieno e ci sono gia' MAX scrittori che attendono di scrivere viene perduto il valore che da&lt;br /&gt;
piu' tempo nel buffer attende di venir letto, il primo processo in attesa di scrivere puo' cosi' scrivere il suo elemento nel buffer e sbloccarsi.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di BAGG===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#define MAX 42&lt;br /&gt;
#define empty NULL&lt;br /&gt;
&lt;br /&gt;
monitor lwlrbb {&lt;br /&gt;
    generic_type bb[] ;&lt;br /&gt;
    int count, front, rear ; 	/* rispettivamente: numero elementi, dove scrivere nel buffer, dove leggere nel buffer */&lt;br /&gt;
    int nw, nr ; 		/* rispettivamente numero di writer e reader */&lt;br /&gt;
    bool exit ; 		/* server ai reader per sapere se devono ritornare NULL al loro rientro nel monitor  */&lt;br /&gt;
    condition canr, canw ;&lt;br /&gt;
&lt;br /&gt;
    lwlrbb(void) {&lt;br /&gt;
        bb = new generic_type[MAX] ;&lt;br /&gt;
        count = front = rear = nw = nr = exit = 0 ;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry void write(generic_type val) {&lt;br /&gt;
        if(count == MAX) {			/* se count è MAX non si può scrivere  */&lt;br /&gt;
            if(nw == MAX) {			/* se la coda è piena devo fare spazio */&lt;br /&gt;
                bb[rear] = empty ;		/* rear indica il più vecchio elemento ancora da leggere */&lt;br /&gt;
                rear = (rear + 1)%MAX ;&lt;br /&gt;
                count -= 1 ;&lt;br /&gt;
                nw += 1 ;			/* incremento prima perchè anche se la coda è piena ora dopo la signal ci sarà un posto...  */&lt;br /&gt;
                canw.signal() ;			/* ora il primo che aspettava può scrivere --&amp;gt; lo sveglio  */&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -= 1 ;&lt;br /&gt;
            } else {				/* se la coda non è piena devo comunque aspettare...  */&lt;br /&gt;
                nw += 1 ;&lt;br /&gt;
                canw.wait() ;&lt;br /&gt;
                nw -=1 ;&lt;br /&gt;
            }&lt;br /&gt;
        } &lt;br /&gt;
	bb[front] = val ;					&lt;br /&gt;
        front = (front + 1)%MAX ;&lt;br /&gt;
        count += 1 ;&lt;br /&gt;
        canr.signal() ;				/* potrebbe esserci un reader che aspetta --&amp;gt; segnalo che ho scritto e si può leggere  */&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    entry generic_type read(void) {&lt;br /&gt;
        if(count == 0) {			/* se non c'è nulla da leggere allora devo aspettare  */&lt;br /&gt;
            if(nr == MAX) {			/* se la coda è piena setto exit, che i reader controllano per sapere se sono stati svegliati per ritornare NULL  */&lt;br /&gt;
                exit = 1 ;&lt;br /&gt;
                canr.signal() ;		        /* sveglio il condannato...  */&lt;br /&gt;
            } nr += 1 ;				/* mi accodo... */&lt;br /&gt;
            canr.wait() ;&lt;br /&gt;
            nr -= 1 ;&lt;br /&gt;
            if(exit) {				/* se sono il condannato resetto la variabile ed esco...  */&lt;br /&gt;
                 exit = 0 ;&lt;br /&gt;
                 return NULL ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        generic_type r = bb[rear] ;&lt;br /&gt;
        rear = (rear + 1)%MAX ;&lt;br /&gt;
        count -= 1 ;&lt;br /&gt;
        canw.signal() ;				/* ho letto, quindi si è liberato un posto e almeno un writer può scrivere... */&lt;br /&gt;
        return r ;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=50_Sfumature_di_Fibonacci&amp;diff=975</id>
		<title>50 Sfumature di Fibonacci</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=50_Sfumature_di_Fibonacci&amp;diff=975"/>
		<updated>2015-04-08T16:56:34Z</updated>

		<summary type="html">&lt;p&gt;BAGG: /* di Cristiano Piemontese (aka B.A.G.G) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==di Cristiano Piemontese (aka B.A.G.G)==&lt;br /&gt;
&lt;br /&gt;
N.B. purtroppo non sono davvero 50 versioni di Fibonacci...&lt;br /&gt;
&lt;br /&gt;
Mentre sperimentavo per prendere confidenza con bash il mio pensiero è subito volato alla tanto amata ricorsione e allora ho deciso che era il momento di provare a implementare Fibonacci, nella sua versione con ricorsione di coda (già è lenta questa, figuriamoci la versione normale...), in bash: le due versioni sono quasi equivalenti nel codice utilizzato, ma è comunque stato utile realizzarle entrambe per capire meglio l'uso del linguaggio...&lt;br /&gt;
&lt;br /&gt;
===Script ricorsivi:===&lt;br /&gt;
&lt;br /&gt;
Questa versione si compone di due script: un &amp;quot;interfaccia&amp;quot; con la quale l'utente può chiamare Fibonacci nella versione consueta, cioè col solo parametro n; l'algoritmo effettivo che calcola Fibonacci, cioè uno script che richiama se stesso coi parametri aggiornati:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    script Interfaccia:&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
usagerr=-1&lt;br /&gt;
if [[ -z $1 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: ./fib.sh num (other arguments will not be considered)&amp;quot;&lt;br /&gt;
	exit $usagerr &lt;br /&gt;
elif [[ $1 -lt 0 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;num must be &amp;gt;= 0&amp;quot;&lt;br /&gt;
	exit $usagerr&lt;br /&gt;
elif [[ $1 -eq 0 ]]&lt;br /&gt;
then &lt;br /&gt;
	echo &amp;quot;0&amp;quot;&lt;br /&gt;
elif [[ $1 -ge 1 ]]&lt;br /&gt;
then &lt;br /&gt;
	echo $(./fibtr.sh $1 1 1)&lt;br /&gt;
fi&lt;br /&gt;
exit 0	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    script Algoritmo:&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
n=$1&lt;br /&gt;
f1=$2	&lt;br /&gt;
f2=$3&lt;br /&gt;
if [[ $1 -le 2 ]] &lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;$f1&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	tmp=$f2			&lt;br /&gt;
	f2=$f1&lt;br /&gt;
	f1=`expr $f1 + $tmp`&lt;br /&gt;
	n=`expr $n - 1`&lt;br /&gt;
	echo $(./fibtr.sh $n $f1 $f2)&lt;br /&gt;
fi&lt;br /&gt;
exit 0		&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Funzioni bash ricorsive:===&lt;br /&gt;
&lt;br /&gt;
Questa versione include in un unico script entrambe le funzioni, cioè la &amp;quot;funzioni interfaccia&amp;quot; e la funzione vera e propria:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ -z $1 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: ./fibfunc.sh num (other arguments will not be considered)&amp;quot;&lt;br /&gt;
        exit -1&lt;br /&gt;
&lt;br /&gt;
n=$1&lt;br /&gt;
f1=1&lt;br /&gt;
f2=1&lt;br /&gt;
&lt;br /&gt;
fib () {&lt;br /&gt;
	if [[ $1 -lt 0 ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo &amp;quot;num must be greater than zero!&amp;quot;&lt;br /&gt;
	elif [[ $1 -eq 0 ]]&lt;br /&gt;
	then &lt;br /&gt;
		echo &amp;quot;0&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		echo $(fibtr $n 1 1) &lt;br /&gt;
	fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fibtr () {&lt;br /&gt;
	if [[ $1 -le 2 ]] &lt;br /&gt;
	then&lt;br /&gt;
		echo $f1&lt;br /&gt;
	else &lt;br /&gt;
		tmp=$f2&lt;br /&gt;
		f2=$f1&lt;br /&gt;
		f1=`expr $f1 + $tmp`&lt;br /&gt;
		n=`expr $n - 1`&lt;br /&gt;
		echo $(fibtr $n $f1 $f2)&lt;br /&gt;
	fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $(fib $n)&lt;br /&gt;
&lt;br /&gt;
exit 0	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=970</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=970"/>
		<updated>2015-04-07T19:45:58Z</updated>

		<summary type="html">&lt;p&gt;BAGG: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[50 Sfumature di Fibonacci]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 Prova Pratica 20/06/12]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3 Prova Pratica 17/06/14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 3, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova pratica 17 07 14]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.01.2015]]&lt;br /&gt;
&lt;br /&gt;
[[bash scripting 2002 gennaio]]&lt;br /&gt;
&lt;br /&gt;
[[Process Race (Prova pratica 18-07-2013)]]&lt;br /&gt;
&lt;br /&gt;
[[Arduino web controller]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 29.05.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20.06.2013]]&lt;br /&gt;
&lt;br /&gt;
[[Prova_pratica_21_01_15]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 17.06.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1 - 25.09.2014]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 20/02/2014]]&lt;br /&gt;
&lt;br /&gt;
[[Demone ruba input]]&lt;br /&gt;
&lt;br /&gt;
[[wifi daemon]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 13/09/2013]]&lt;br /&gt;
&lt;br /&gt;
[[Problema Dei Filosofi]]&lt;br /&gt;
&lt;br /&gt;
[http://www.cs.unibo.it/~renzo/so/portability.tgz portability.tgz]&lt;br /&gt;
&lt;br /&gt;
[[listx.h commentato + esempio su container_of]]&lt;br /&gt;
&lt;br /&gt;
[[Congettura di Goldbach]]&lt;br /&gt;
&lt;br /&gt;
[[list segments]]&lt;br /&gt;
&lt;br /&gt;
[[Execv/fork su file aperto]]&lt;br /&gt;
&lt;br /&gt;
[[Angry_Children]]&lt;br /&gt;
&lt;br /&gt;
[[Esercizio 1, prova pratica 12/02/2009]]&lt;br /&gt;
&lt;br /&gt;
[[(Programma C) Un quadrato nella matrice]]&lt;br /&gt;
&lt;br /&gt;
[[&amp;quot;classi&amp;quot;_in_C]]&lt;br /&gt;
&lt;br /&gt;
[[Esempi del 02 dicembre 2014]]&lt;br /&gt;
&lt;br /&gt;
[[Materiale dell'AA 2013-14]]&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=50_Sfumature_di_Fibonacci&amp;diff=969</id>
		<title>50 Sfumature di Fibonacci</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=50_Sfumature_di_Fibonacci&amp;diff=969"/>
		<updated>2015-04-07T19:42:50Z</updated>

		<summary type="html">&lt;p&gt;BAGG: /* Algoritmo di Fibonacci in Bash - Cristiano Piemontese */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==di Cristiano Piemontese (aka B.A.G.G)==&lt;br /&gt;
&lt;br /&gt;
Mentre sperimentavo per prendere confidenza con bash il mio pensiero è subito volato alla tanto amata ricorsione e allora ho deciso che era il momento di provare a implementare Fibonacci, nella sua versione con ricorsione di coda (già è lenta questa, figuriamoci la versione normale...), in bash: le due versioni sono quasi equivalenti nel codice utilizzato, ma è comunque stato utile realizzarle entrambe per capire meglio l'uso del linguaggio...&lt;br /&gt;
&lt;br /&gt;
===Script ricorsivi:===&lt;br /&gt;
&lt;br /&gt;
Questa versione si compone di due script: un &amp;quot;interfaccia&amp;quot; con la quale l'utente può chiamare Fibonacci nella versione consueta, cioè col solo parametro n; l'algoritmo effettivo che calcola Fibonacci, cioè uno script che richiama se stesso coi parametri aggiornati:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
    Interfaccia:&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
usagerr=-1&lt;br /&gt;
if [[ -z $1 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: ./fib.sh num (other arguments will not be considered)&amp;quot;&lt;br /&gt;
	exit $usagerr &lt;br /&gt;
elif [[ $1 -lt 0 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;num must be &amp;gt;= 0&amp;quot;&lt;br /&gt;
	exit $usagerr&lt;br /&gt;
elif [[ $1 -eq 0 ]]&lt;br /&gt;
then &lt;br /&gt;
	echo &amp;quot;0&amp;quot;&lt;br /&gt;
elif [[ $1 -ge 1 ]]&lt;br /&gt;
then &lt;br /&gt;
	echo $(./fibtr.sh $1 1 1)&lt;br /&gt;
fi&lt;br /&gt;
exit 0	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    Algoritmo:&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
n=$1&lt;br /&gt;
f1=$2	&lt;br /&gt;
f2=$3&lt;br /&gt;
if [[ $1 -le 2 ]] &lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;$f1&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
	tmp=$f2			&lt;br /&gt;
	f2=$f1&lt;br /&gt;
	f1=`expr $f1 + $tmp`&lt;br /&gt;
	n=`expr $n - 1`&lt;br /&gt;
	echo $(./fibtr.sh $n $f1 $f2)&lt;br /&gt;
fi&lt;br /&gt;
exit 0		&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Funzioni bash ricorsive:===&lt;br /&gt;
&lt;br /&gt;
Questa versione include in un unico script entrambe le funzioni, cioè la &amp;quot;funzioni interfaccia&amp;quot; e la funzione vera e propria:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ -z $1 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: ./fibfunc.sh num (other arguments will not be considered)&amp;quot;&lt;br /&gt;
        exit -1&lt;br /&gt;
&lt;br /&gt;
n=$1&lt;br /&gt;
f1=1&lt;br /&gt;
f2=1&lt;br /&gt;
&lt;br /&gt;
fib () {&lt;br /&gt;
	if [[ $1 -lt 0 ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo &amp;quot;num must be greater than zero!&amp;quot;&lt;br /&gt;
	elif [[ $1 -eq 0 ]]&lt;br /&gt;
	then &lt;br /&gt;
		echo &amp;quot;0&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		echo $(fibtr $n 1 1) &lt;br /&gt;
	fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fibtr () {&lt;br /&gt;
	if [[ $1 -le 2 ]] &lt;br /&gt;
	then&lt;br /&gt;
		echo $f1&lt;br /&gt;
	else &lt;br /&gt;
		tmp=$f2&lt;br /&gt;
		f2=$f1&lt;br /&gt;
		f1=`expr $f1 + $tmp`&lt;br /&gt;
		n=`expr $n - 1`&lt;br /&gt;
		echo $(fibtr $n $f1 $f2)&lt;br /&gt;
	fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
echo $(fib $n)&lt;br /&gt;
&lt;br /&gt;
exit 0	&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>BAGG</name></author>
	</entry>
</feed>