<?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=DaniC</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=DaniC"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/DaniC"/>
	<updated>2026-05-05T04:26:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=525</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=525"/>
		<updated>2014-03-29T12:44:24Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.1&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoexit&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting /* coda delle coppie (colore,azione) dei processi in attesa di entrare (azione==1)&lt;br /&gt;
			 o uscire (azione==-1) */&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo o rimuovendo (in base a i) un processo del colore passato&lt;br /&gt;
	viene rispettato il 75% dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore, int i) { &lt;br /&gt;
		return (running[colore]+i&amp;gt;=running[1-colore]*3 || (running[colore]+i)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia il processo in testa alla coda waiting se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore,azione = waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore,azione)) {&lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				if (azione == 1)&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				else&lt;br /&gt;
					oktoexit.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore,1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,1)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		if (morethan75p(colore,-1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,-1)&lt;br /&gt;
			oktoexit.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLUE 1&lt;br /&gt;
int majorcolor = -1&lt;br /&gt;
int numproc[2] = 0,0&lt;br /&gt;
cond oktoenter[2]  //bastavano due condizioni.&lt;br /&gt;
cond oktoexit[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	procedure entry enter(COL){&lt;br /&gt;
		if(COL == majorcolor){&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;lt; 75)&lt;br /&gt;
				oktoenter[COL].wait()&lt;br /&gt;
			if(majorcolor == -1)&lt;br /&gt;
				majorcolor == COL&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			majorcolor = COL&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(COL){&lt;br /&gt;
		if(numproc[COL] + numproc[1-COL] == 1){&lt;br /&gt;
			majorcolor = -1&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == majorcolor){&lt;br /&gt;
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;lt; 75){&lt;br /&gt;
				oktoexit[COL].wait()&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoexit[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLU 1&lt;br /&gt;
&lt;br /&gt;
limcol{&lt;br /&gt;
	/*variable*/&lt;br /&gt;
	int array[2] = 0,0;&lt;br /&gt;
	color major = -1;&lt;br /&gt;
	/*condition*/&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	condition oktoleave[2];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter( color ){&lt;br /&gt;
		if ( majorcolor == -1 ) &lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( majorcolor == (1-color) &amp;amp;&amp;amp; newmajorcolor%(color) &amp;lt; 75% )&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		array[color]++; &lt;br /&gt;
		if ( majorcolor == -1 )            //se un processo si risveglia nel monitor vuoto deve impostare majorcolor&lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( newmajorcolor%(1-color) &amp;gt;= 75% )         &lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit( color ){&lt;br /&gt;
		if ( majorcolor == color &amp;amp;&amp;amp; majorcolor_less1%(color) &amp;gt; 75% )&lt;br /&gt;
			oktoleave[color].wait();&lt;br /&gt;
		array[color]--;&lt;br /&gt;
		if ( !colorsempty() )&lt;br /&gt;
			if ( majorcolor_less1%(color) &amp;gt;= 75% )&lt;br /&gt;
				oktoleave[1-color].signal();&lt;br /&gt;
		else{&lt;br /&gt;
			majorcolor == -1;&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
				}&lt;br /&gt;
					}	 &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
newmajorcolor%(color) calcola la nuova % del colore maggiore aggiungendo color&lt;br /&gt;
majorcolor_less1%(color) calcola la nuova % del colore maggiore togliendo color&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pir@t@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#DEFINE BLUE 0&lt;br /&gt;
#DEFINE RED 1&lt;br /&gt;
monitor limcol{&lt;br /&gt;
condition ok;&lt;br /&gt;
int numcolor[2];&lt;br /&gt;
Queue q;&lt;br /&gt;
int i=1;&lt;br /&gt;
procedure entry enter(color){&lt;br /&gt;
if((numcolor[color] + 1 &amp;lt; float((tot+1)*(75/100))  &amp;amp;&amp;amp;&lt;br /&gt;
   numcolor[color] + 1 &amp;gt;= float((tot+1)*(25/100))) ||&lt;br /&gt;
   !q.empty() ) &lt;br /&gt;
	{&lt;br /&gt;
	q.enqueue(color);&lt;br /&gt;
	ok.wait();&lt;br /&gt;
	i++;&lt;br /&gt;
	if(!q.empty()){&lt;br /&gt;
          if(numcolor[q.head()] + i &amp;gt;= float((tot+i)*(75/100)) ||&lt;br /&gt;
	   numcolor[q.head()] + i &amp;lt; float((tot+i)*(25/100)))  )&lt;br /&gt;
	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
	i=1;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
numcolor[color]++;&lt;br /&gt;
tot++;&lt;br /&gt;
}&lt;br /&gt;
procedure entry exit(color){&lt;br /&gt;
numcolor[color]--;&lt;br /&gt;
tot--;&lt;br /&gt;
if( numcolor[q.head()] + 1 &amp;gt;= float((tot+1)*(75/100))  ||&lt;br /&gt;
    numcolor[q.head()] + 1 &amp;lt; float((tot+1)*(25/100)) )&lt;br /&gt;
  	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio c.2==&lt;br /&gt;
Per quali indici n le funzioni foo possono essere utilizzate al posto della test&amp;amp;set?&lt;br /&gt;
&lt;br /&gt;
Risposta: per n = 5&lt;br /&gt;
&lt;br /&gt;
Nella Test&amp;amp;Set x prende il valore di y, quindi y deve essere = booln(x,y)&lt;br /&gt;
Andiamo a vedere per quali valori y è uguale a booln(x,y)&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! x || y || bool0 || bool1 || bool2 || bool3 || bool4 || bool5 || bool6 || bool7 || bool8 || bool9 || bool10 || bool11 || bool12 || bool13 || bool14 || bool15&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || '''0''' || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 0 || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1''' || 0 || 0 || 0 || 0 || '''1''' || '''1''' || '''1''' || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''0''' || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1 || '''0''' || '''0''' || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 1 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1''' || 0 || '''1'''&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In bold sono indicati i valori per cui y = booln(x,y)&lt;br /&gt;
L'unico caso in cui i valori sono evidenziati in ogni riga è per bool5.&lt;br /&gt;
&lt;br /&gt;
Giulia (non sono molto sicura della soluzione, ma questo è il ragionamento che mi è sembrato più corretto)&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Reference String&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 4 || 5 || 6 || 3 || 2 || 1 || 3 || 2 || 1 || 6 || 5 || 4 || 6 || 5 || 4 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 1&lt;br /&gt;
| 1 || 1 || 1 || 4 || 4 || 4 ||   ||   ||   || 3 || 3 || 3 ||   ||   ||   || 6 || 6 || 6 ||   ||   ||   || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 2&lt;br /&gt;
|   || 2 || 2 || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2 ||   ||   ||   || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 3&lt;br /&gt;
|   ||   || 3 || 3 || 3 || 6 ||   ||   ||   || 6 || 6 || 1 ||   ||   ||   || 1 || 1 || 4 ||   ||   ||   || 4 || 4 || 3&lt;br /&gt;
|}&lt;br /&gt;
                        &lt;br /&gt;
The above Reference String is both FIFO, LRU and MIN compliant.&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=521</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=521"/>
		<updated>2014-03-29T12:28:55Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	condition oktoexit&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting /* coda delle coppie (colore,azione) dei processi in attesa di entrare (azione==1)&lt;br /&gt;
			 o uscire (azione==-1) */&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo o rimuovendo (in base a i) un processo del colore passato&lt;br /&gt;
	viene rispettato il 75% dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore, int i) { &lt;br /&gt;
		return (running[colore]+i&amp;gt;=running[1-colore]*3 || (running[colore]+i)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore,azione = waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore,azione)) {&lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				if (azione == 1)&lt;br /&gt;
					oktoenter.signal()&lt;br /&gt;
				else&lt;br /&gt;
					oktoexit.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore,1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,1)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		if (morethan75p(colore,-1)==false) {&lt;br /&gt;
			waiting.enqueue(colore,-1)&lt;br /&gt;
			oktoexit.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLUE 1&lt;br /&gt;
int majorcolor = -1&lt;br /&gt;
int numproc[2] = 0,0&lt;br /&gt;
cond oktoenter[2]  //bastavano due condizioni.&lt;br /&gt;
cond oktoexit[2]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
	procedure entry enter(COL){&lt;br /&gt;
		if(COL == majorcolor){&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			if((proc[majorcolor]*100/(numproc[COL] + numproc[1-COL] + 1)) &amp;lt; 75)&lt;br /&gt;
				oktoenter[COL].wait()&lt;br /&gt;
			if(majorcolor == -1)&lt;br /&gt;
				majorcolor == COL&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			numproc[COL]++&lt;br /&gt;
			majorcolor = COL&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit(COL){&lt;br /&gt;
		if(numproc[COL] + numproc[1-COL] == 1){&lt;br /&gt;
			majorcolor = -1&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			oktoenter[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == majorcolor){&lt;br /&gt;
			if(((proc[majorcolor] - 1)*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;lt; 75){&lt;br /&gt;
				oktoexit[COL].wait()&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		else if(COL == 1-majorcolor){&lt;br /&gt;
			numproc[COL]--&lt;br /&gt;
			if(((proc[majorcolor])*100/(numproc[COL] + numproc[1-COL] - 1)) &amp;gt;= 75)&lt;br /&gt;
				oktoexit[1-COL].signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
define RED 0&lt;br /&gt;
define BLU 1&lt;br /&gt;
&lt;br /&gt;
limcol{&lt;br /&gt;
	/*variable*/&lt;br /&gt;
	int array[2] = 0,0;&lt;br /&gt;
	color major = -1;&lt;br /&gt;
	/*condition*/&lt;br /&gt;
	condition oktoenter[2];&lt;br /&gt;
	condition oktoleave[2];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	procedure entry enter( color ){&lt;br /&gt;
		if ( majorcolor == -1 ) &lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( majorcolor == (1-color) &amp;amp;&amp;amp; newmajorcolor%(color) &amp;lt; 75% )&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		array[color]++; &lt;br /&gt;
		if ( majorcolor == -1 )            //se un processo si risveglia nel monitor vuoto deve impostare majorcolor&lt;br /&gt;
			majorcolor = color;&lt;br /&gt;
		if ( newmajorcolor%(1-color) &amp;gt;= 75% )         &lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
	procedure entry exit( color ){&lt;br /&gt;
		if ( majorcolor == color &amp;amp;&amp;amp; majorcolor_less1%(color) &amp;gt; 75% )&lt;br /&gt;
			oktoleave[color].wait();&lt;br /&gt;
		array[color]--;&lt;br /&gt;
		if ( !colorsempty() )&lt;br /&gt;
			if ( majorcolor_less1%(color) &amp;gt;= 75% )&lt;br /&gt;
				oktoleave[1-color].signal();&lt;br /&gt;
		else{&lt;br /&gt;
			majorcolor == -1;&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
				}&lt;br /&gt;
					}	 &lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
newmajorcolor%(color) calcola la nuova % del colore maggiore aggiungendo color&lt;br /&gt;
majorcolor_less1%(color) calcola la nuova % del colore maggiore togliendo color&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pir@t@&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#DEFINE BLUE 0&lt;br /&gt;
#DEFINE RED 1&lt;br /&gt;
monitor limcol{&lt;br /&gt;
condition ok;&lt;br /&gt;
int numcolor[2];&lt;br /&gt;
Queue q;&lt;br /&gt;
int i=1;&lt;br /&gt;
procedure entry enter(color){&lt;br /&gt;
if((numcolor[color] + 1 &amp;lt; float((tot+1)*(75/100))  &amp;amp;&amp;amp;&lt;br /&gt;
   numcolor[color] + 1 &amp;gt;= float((tot+1)*(25/100))) ||&lt;br /&gt;
   !q.empty() ) &lt;br /&gt;
	{&lt;br /&gt;
	q.enqueue(color);&lt;br /&gt;
	ok.wait();&lt;br /&gt;
	i++;&lt;br /&gt;
	if(!q.empty()){&lt;br /&gt;
          if(numcolor[q.head()] + i &amp;gt;= float((tot+i)*(75/100)) ||&lt;br /&gt;
	   numcolor[q.head()] + i &amp;lt; float((tot+i)*(25/100)))  )&lt;br /&gt;
	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
	i=1;&lt;br /&gt;
	}&lt;br /&gt;
	}&lt;br /&gt;
numcolor[color]++;&lt;br /&gt;
tot++;&lt;br /&gt;
}&lt;br /&gt;
procedure entry exit(color){&lt;br /&gt;
numcolor[color]--;&lt;br /&gt;
tot--;&lt;br /&gt;
if( numcolor[q.head()] + 1 &amp;gt;= float((tot+1)*(75/100))  ||&lt;br /&gt;
    numcolor[q.head()] + 1 &amp;lt; float((tot+1)*(25/100)) )&lt;br /&gt;
  	{&lt;br /&gt;
	q.dequeue();&lt;br /&gt;
	ok.signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio g.1==&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Reference String&lt;br /&gt;
| 1 || 2 || 3 || 4 || 5 || 6 || 4 || 5 || 6 || 3 || 2 || 1 || 3 || 2 || 1 || 6 || 5 || 4 || 6 || 5 || 4 || 1 || 2 || 3&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 1&lt;br /&gt;
| 1 || 1 || 1 || 4 || 4 || 4 ||   ||   ||   || 3 || 3 || 3 ||   ||   ||   || 6 || 6 || 6 ||   ||   ||   || 1 || 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 2&lt;br /&gt;
|   || 2 || 2 || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2 ||   ||   ||   || 2 || 5 || 5 ||   ||   ||   || 5 || 2 || 2&lt;br /&gt;
|-&lt;br /&gt;
! Page Frame 3&lt;br /&gt;
|   ||   || 3 || 3 || 3 || 6 ||   ||   ||   || 6 || 6 || 1 ||   ||   ||   || 1 || 1 || 4 ||   ||   ||   || 4 || 4 || 3&lt;br /&gt;
|}&lt;br /&gt;
                        &lt;br /&gt;
The above Reference String is both FIFO, LRU and MIN compliant.&lt;br /&gt;
&lt;br /&gt;
-TomOgn&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=513</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=513"/>
		<updated>2014-03-28T16:22:03Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting // coda dei colori dei processi in attesa&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo un processo del colore passato viene rispettato il 75%&lt;br /&gt;
	dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore) { &lt;br /&gt;
		return (running[colore]+1&amp;gt;=running[1-colore]*3 || (running[colore]+1)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup() {&lt;br /&gt;
		if (waiting.empty() == false) {&lt;br /&gt;
			colore=waiting.head() // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
			if (morethan75p(colore)) { &lt;br /&gt;
				waiting.dequeue()&lt;br /&gt;
				oktoenter.signal()&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore)==false) {&lt;br /&gt;
			waiting.enqueue(colore)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup()&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* la politica FIFO impedisce che si verifichi starvation, perché nel caso pessimo un processo&lt;br /&gt;
che vuole entrare dovrà attendere fino a che tutti quelli in esecuzione terminino */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=512</id>
		<title>ProvaTeorica 2012.07.16</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.07.16&amp;diff=512"/>
		<updated>2014-03-28T15:57:42Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.cs.unibo.it/~renzo/so/compiti/2012-07-16.tot.pdf Link Testo]&lt;br /&gt;
&amp;lt;h2&amp;gt;Esercizio C.2&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mia Soluzione:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define RED 0&lt;br /&gt;
#define BLUE 1&lt;br /&gt;
//restituisce 1 se c'e piu del 75% blue o 75% di red&lt;br /&gt;
//restituisce 0 se non c'e una maggiornza&lt;br /&gt;
int media(color){&lt;br /&gt;
	int mediared;&lt;br /&gt;
	int localinto =  into;&lt;br /&gt;
	if (color != NULL){&lt;br /&gt;
		localinto[color]++;&lt;br /&gt;
	}&lt;br /&gt;
	mediared = ((100*localinto[0])/(localinto[0]+localinto[1]));&lt;br /&gt;
	if(mediared &amp;gt;=75 || mediared &amp;lt; 25){&lt;br /&gt;
		return 1;//75% di rossi o di blue&lt;br /&gt;
	}else{&lt;br /&gt;
		return 0;// non c'e maggioranza		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
monitor limcol{&lt;br /&gt;
&lt;br /&gt;
	conditon oktoenter[2];&lt;br /&gt;
	int into[2];&lt;br /&gt;
&lt;br /&gt;
	enter(color){&lt;br /&gt;
		if(media(color) != 1){// attendo perche' non c'e una maggioranza&lt;br /&gt;
			oktoenter[color].wait();&lt;br /&gt;
		}&lt;br /&gt;
		into[color]++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(color){&lt;br /&gt;
		into[color]--;&lt;br /&gt;
		if(media(1-color) == 1){&lt;br /&gt;
			oktoenter[1-color].signal();&lt;br /&gt;
		}else if(media(color) == 1){&lt;br /&gt;
			oktoenter[color].signal();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#define ROSSO 0&lt;br /&gt;
#define BLU 1&lt;br /&gt;
&lt;br /&gt;
monitor limcol {&lt;br /&gt;
	condition oktoenter&lt;br /&gt;
	int running[2] // numero di processi rossi [0] e blu [1] in esecuzione&lt;br /&gt;
	queue waiting // coda dei colori dei processi in attesa&lt;br /&gt;
	&lt;br /&gt;
	/* restituisce true se aggiungendo un processo del colore passato viene rispettato il 75%&lt;br /&gt;
	dei processi di un colore */&lt;br /&gt;
	bool morethan75p(colore) { &lt;br /&gt;
		return (running[colore]+1&amp;gt;=running[1-colore]*3 || (running[colore]+1)*3&amp;lt;=running[1-colore])&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	// risveglia un processo del colore passato se è possibile farlo&lt;br /&gt;
	void checkwakeup(colore) {&lt;br /&gt;
		if (morethan75p(colore)) { &lt;br /&gt;
			waiting.dequeue()&lt;br /&gt;
			oktoenter.signal()&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry enter(colore) {&lt;br /&gt;
		if (morethan75p(colore)==false) {&lt;br /&gt;
			waiting.enqueue(colore)&lt;br /&gt;
			oktoenter.wait()&lt;br /&gt;
		}&lt;br /&gt;
		running[colore]++&lt;br /&gt;
		checkwakeup(waiting.head()) // head resituisce l'elemento in testa senza rimuoverlo&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry exit(colore) {&lt;br /&gt;
		running[colore]--&lt;br /&gt;
		checkwakeup(waiting.head())&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* la politica FIFO impedisce che si verifichi starvation, perché nel caso pessimo un processo&lt;br /&gt;
che vuole entrare dovrà attendere fino a che tutti quelli in esecuzione terminino */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Daniele Cortesi&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.07.18&amp;diff=360</id>
		<title>ProvaPratica 2013.07.18</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.07.18&amp;diff=360"/>
		<updated>2013-11-26T12:45:32Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
18 luglio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 3:&lt;br /&gt;
        print(&amp;quot;The function requires two arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    srcDir = str(argv[1])&lt;br /&gt;
    dstDir = str(argv[2])&lt;br /&gt;
    if not os.path.isdir(srcDir):&lt;br /&gt;
        print(&amp;quot;First argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    if not os.path.isdir(dstDir):&lt;br /&gt;
        print(&amp;quot;Second argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file base name - occurrences}&lt;br /&gt;
    nameFreq = { }&lt;br /&gt;
    for dirPath, dirNames, fileNames in os.walk(srcDir):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            fileBaseName, _ = os.path.splitext(fileName)&lt;br /&gt;
            nameFreq[fileBaseName] = nameFreq.get(fileBaseName, -1) + 1&lt;br /&gt;
            &lt;br /&gt;
            # Create a soft link&lt;br /&gt;
            freq = nameFreq[fileBaseName]&lt;br /&gt;
            linkName = &amp;quot;{0}{1}&amp;quot;.format(fileBaseName, str(freq) if freq &amp;gt; 0 else &amp;quot;&amp;quot;)&lt;br /&gt;
            srcPath = os.path.join(os.path.abspath(dirPath), fileName)&lt;br /&gt;
            dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            if not os.path.lexists(dstPath):&lt;br /&gt;
                os.symlink(srcPath, dstPath)&lt;br /&gt;
        &lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questa è la mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def collectfiles(arg1,arg2): &lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		B=str(fcd.pop())&lt;br /&gt;
		C='{0}/{1}'.format(arg1,B)&lt;br /&gt;
		if os.path.isdir('{0}'.format(C)):&lt;br /&gt;
			collectfiles(C,arg2)&lt;br /&gt;
		elif os.path.isfile('{0}'.format(C)):&lt;br /&gt;
			try:&lt;br /&gt;
				os.symlink('{0}'.format(C), '{0}/{1}'.format(arg2,B))&lt;br /&gt;
			except OSError:&lt;br /&gt;
				i=1&lt;br /&gt;
				while True:&lt;br /&gt;
					try:&lt;br /&gt;
						os.symlink('{0}'.format(C), '{0}/{1}{2}'.format(arg2,B,i))&lt;br /&gt;
						break&lt;br /&gt;
					except OSError:&lt;br /&gt;
						i=i+1&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	collectfiles(str(sys.argv[1]),str(sys.argv[2]))&lt;br /&gt;
except OSError:&lt;br /&gt;
		print(&amp;quot;Invalid Directory!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Fede&lt;br /&gt;
&lt;br /&gt;
Leggendo la tua versione ho pensato che in effetti se i file sono &amp;quot;&amp;quot;&amp;quot;pochi&amp;quot;&amp;quot;&amp;quot; l'hash-table non e' necessaria. E' sufficiente un controllo iterativo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
18 luglio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 3:&lt;br /&gt;
        print(&amp;quot;The function requires two arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    srcDir = str(argv[1])&lt;br /&gt;
    dstDir = str(argv[2])&lt;br /&gt;
    if not os.path.isdir(srcDir):&lt;br /&gt;
        print(&amp;quot;First argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    if not os.path.isdir(dstDir):&lt;br /&gt;
        print(&amp;quot;Second argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Traverse the directory tree and create a soft link for each file&lt;br /&gt;
    for dirPath, _, fileNames in os.walk(srcDir):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            # 'example.pdf' -&amp;gt; 'example'&lt;br /&gt;
            # 'example.xml' -&amp;gt; 'example'&lt;br /&gt;
            fileBaseName, _ = os.path.splitext(fileName)&lt;br /&gt;
            linkName = fileBaseName&lt;br /&gt;
            srcPath = os.path.join(os.path.abspath(dirPath), fileName)&lt;br /&gt;
            dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            i = 0&lt;br /&gt;
            while os.path.isfile(dstPath):&lt;br /&gt;
                # 'example' will point to 'example.pdf'&lt;br /&gt;
                # 'example1' will point to 'example.xml'&lt;br /&gt;
                i += 1&lt;br /&gt;
                linkName = fileBaseName + str(i)&lt;br /&gt;
                dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            if not os.path.lexists(dstPath):&lt;br /&gt;
                os.symlink(srcPath, dstPath)&lt;br /&gt;
        &lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ecco la mia versione in bash&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
 &lt;br /&gt;
BornAgainFede () {&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*; do&lt;br /&gt;
	bn=$(basename &amp;quot;$f&amp;quot;)&lt;br /&gt;
	if [[ -f $f ]] ; then&lt;br /&gt;
		if [[ -h &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot; ]] ; then&lt;br /&gt;
			i=1&lt;br /&gt;
			while [[ -h &amp;quot;$2&amp;quot;/&amp;quot;$bn$i&amp;quot; ]] ; do&lt;br /&gt;
			let &amp;quot;i += 1&amp;quot; &lt;br /&gt;
			done&lt;br /&gt;
			ln -s &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;/&amp;quot;$bn$i&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			ln -s &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	fi&lt;br /&gt;
	if [[ -d $f ]] ; then&lt;br /&gt;
		BornAgainFede &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
BornAgainFede &amp;quot;$1&amp;quot; &amp;quot;$2&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Versione by Daniele Cortesi:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from sys import argv&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
#controllo se il programma e' stato chiamato correttamente&lt;br /&gt;
if len(argv)&amp;lt;3:&lt;br /&gt;
	print &amp;quot;uso: programma cartella1 cartella2&amp;quot;&lt;br /&gt;
	exit(1)&lt;br /&gt;
	&lt;br /&gt;
dir1=argv[1]&lt;br /&gt;
dir2=argv[2]&lt;br /&gt;
&lt;br /&gt;
#controllo che gli argomenti siano effettivamente cartelle&lt;br /&gt;
if not os.path.isdir(dir1) or  not os.path.isdir(dir2):&lt;br /&gt;
	print &amp;quot;cartelle non valide&amp;quot;&lt;br /&gt;
	exit(1)&lt;br /&gt;
&lt;br /&gt;
cartelle=[os.getcwd()+&amp;quot;/&amp;quot;+dir1] #lista che conterra' mano a mano tutte le sottocartelle&lt;br /&gt;
files={} #dizionario con nomefile: [lista con tutti i file che si chiamano &amp;quot;nomefile&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
while len(cartelle)&amp;gt;0:&lt;br /&gt;
	c=cartelle.pop() &lt;br /&gt;
	for f in os.listdir(c): #analizzo tutti i file nella cartella c&lt;br /&gt;
		#se f non e' una cartella, allora lo inserisco nel dizionario se non c'e', altrimenti aggiungo il suo percorso alla lista&lt;br /&gt;
		if not os.path.isdir(c+&amp;quot;/&amp;quot;+f):&lt;br /&gt;
			if not files.has_key(f):&lt;br /&gt;
				files[f]=[c+&amp;quot;/&amp;quot;+f]&lt;br /&gt;
			else: files[f].append(c+&amp;quot;/&amp;quot;+f)&lt;br /&gt;
		#se f invece e' una cartella, la aggiungo alla lista cosi' alla prossima iterazione (o dopo in caso di piu' cartelle) verra' analizzata&lt;br /&gt;
		else: cartelle.append(c+&amp;quot;/&amp;quot;+f)&lt;br /&gt;
		&lt;br /&gt;
#creo i link simbolici	&lt;br /&gt;
for k in files.keys():&lt;br /&gt;
	for i,f in enumerate(files[k]):&lt;br /&gt;
		link=k&lt;br /&gt;
		if (i&amp;gt;0): link+=str(i)&lt;br /&gt;
		os.symlink(f, dir2+&amp;quot;/&amp;quot;+link)&lt;br /&gt;
&lt;br /&gt;
exit(0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Osservazioni==&lt;br /&gt;
Per prima cosa, bel lavoro!&amp;lt;br/&amp;gt;&lt;br /&gt;
Di seguito riporto alcune osservazioni che mi sono venute in mente, prendetele assolutamente con soli fini &amp;quot;costruttivi&amp;quot;! &lt;br /&gt;
* Se non sbaglio, i due programmi (quello di Tommaso e quello di Fede) hanno un comportamento diverso per quanto concerne l'interpretazione del nome file e, in particolare, dell'estensione:&lt;br /&gt;
** Per Tommaso:&lt;br /&gt;
*** dir1/example.pdf --&amp;gt; example&lt;br /&gt;
*** dir1/example.txt --&amp;gt; example1&lt;br /&gt;
*** dir1/dirX/example.pdf --&amp;gt; example2&lt;br /&gt;
** Per Fede:&lt;br /&gt;
*** dir1/example.pdf --&amp;gt; example.pdf&lt;br /&gt;
*** dir1/example.txt --&amp;gt; example.txt&lt;br /&gt;
*** dir1/dirX/example.pdf --&amp;gt; example.pdf1&lt;br /&gt;
** interpretando in modo &amp;quot;stringente&amp;quot; del testo dell'esercizio avrei ipotizzato un comportamento come quello di Fede.&lt;br /&gt;
* Nel codice sorgente c'è in generale poco &amp;quot;commento&amp;quot;. Commentare il codice è essenziale: permette ad altri di capire immediatamente le scelte implementative fatte e permette a voi di capire al volo il perché di queste scelte nel caso dobbiate riprendere in mano il vostro codice dopo un po' di tempo. Quindi: commentate!!!&lt;br /&gt;
* Bash si presta molto all'esercizio&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.07.18&amp;diff=359</id>
		<title>ProvaPratica 2013.07.18</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.07.18&amp;diff=359"/>
		<updated>2013-11-26T12:33:37Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
18 luglio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 3:&lt;br /&gt;
        print(&amp;quot;The function requires two arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    srcDir = str(argv[1])&lt;br /&gt;
    dstDir = str(argv[2])&lt;br /&gt;
    if not os.path.isdir(srcDir):&lt;br /&gt;
        print(&amp;quot;First argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    if not os.path.isdir(dstDir):&lt;br /&gt;
        print(&amp;quot;Second argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file base name - occurrences}&lt;br /&gt;
    nameFreq = { }&lt;br /&gt;
    for dirPath, dirNames, fileNames in os.walk(srcDir):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            fileBaseName, _ = os.path.splitext(fileName)&lt;br /&gt;
            nameFreq[fileBaseName] = nameFreq.get(fileBaseName, -1) + 1&lt;br /&gt;
            &lt;br /&gt;
            # Create a soft link&lt;br /&gt;
            freq = nameFreq[fileBaseName]&lt;br /&gt;
            linkName = &amp;quot;{0}{1}&amp;quot;.format(fileBaseName, str(freq) if freq &amp;gt; 0 else &amp;quot;&amp;quot;)&lt;br /&gt;
            srcPath = os.path.join(os.path.abspath(dirPath), fileName)&lt;br /&gt;
            dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            if not os.path.lexists(dstPath):&lt;br /&gt;
                os.symlink(srcPath, dstPath)&lt;br /&gt;
        &lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questa è la mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def collectfiles(arg1,arg2): &lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		B=str(fcd.pop())&lt;br /&gt;
		C='{0}/{1}'.format(arg1,B)&lt;br /&gt;
		if os.path.isdir('{0}'.format(C)):&lt;br /&gt;
			collectfiles(C,arg2)&lt;br /&gt;
		elif os.path.isfile('{0}'.format(C)):&lt;br /&gt;
			try:&lt;br /&gt;
				os.symlink('{0}'.format(C), '{0}/{1}'.format(arg2,B))&lt;br /&gt;
			except OSError:&lt;br /&gt;
				i=1&lt;br /&gt;
				while True:&lt;br /&gt;
					try:&lt;br /&gt;
						os.symlink('{0}'.format(C), '{0}/{1}{2}'.format(arg2,B,i))&lt;br /&gt;
						break&lt;br /&gt;
					except OSError:&lt;br /&gt;
						i=i+1&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	collectfiles(str(sys.argv[1]),str(sys.argv[2]))&lt;br /&gt;
except OSError:&lt;br /&gt;
		print(&amp;quot;Invalid Directory!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Fede&lt;br /&gt;
&lt;br /&gt;
Leggendo la tua versione ho pensato che in effetti se i file sono &amp;quot;&amp;quot;&amp;quot;pochi&amp;quot;&amp;quot;&amp;quot; l'hash-table non e' necessaria. E' sufficiente un controllo iterativo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
18 luglio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.07.18.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 3:&lt;br /&gt;
        print(&amp;quot;The function requires two arguments to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    srcDir = str(argv[1])&lt;br /&gt;
    dstDir = str(argv[2])&lt;br /&gt;
    if not os.path.isdir(srcDir):&lt;br /&gt;
        print(&amp;quot;First argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    if not os.path.isdir(dstDir):&lt;br /&gt;
        print(&amp;quot;Second argument should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Traverse the directory tree and create a soft link for each file&lt;br /&gt;
    for dirPath, _, fileNames in os.walk(srcDir):&lt;br /&gt;
        for fileName in fileNames:&lt;br /&gt;
            # 'example.pdf' -&amp;gt; 'example'&lt;br /&gt;
            # 'example.xml' -&amp;gt; 'example'&lt;br /&gt;
            fileBaseName, _ = os.path.splitext(fileName)&lt;br /&gt;
            linkName = fileBaseName&lt;br /&gt;
            srcPath = os.path.join(os.path.abspath(dirPath), fileName)&lt;br /&gt;
            dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            i = 0&lt;br /&gt;
            while os.path.isfile(dstPath):&lt;br /&gt;
                # 'example' will point to 'example.pdf'&lt;br /&gt;
                # 'example1' will point to 'example.xml'&lt;br /&gt;
                i += 1&lt;br /&gt;
                linkName = fileBaseName + str(i)&lt;br /&gt;
                dstPath = os.path.join(dstDir, linkName)&lt;br /&gt;
            if not os.path.lexists(dstPath):&lt;br /&gt;
                os.symlink(srcPath, dstPath)&lt;br /&gt;
        &lt;br /&gt;
    print(&amp;quot;Done!&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ecco la mia versione in bash&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
 &lt;br /&gt;
BornAgainFede () {&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*; do&lt;br /&gt;
	bn=$(basename &amp;quot;$f&amp;quot;)&lt;br /&gt;
	if [[ -f $f ]] ; then&lt;br /&gt;
		if [[ -h &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot; ]] ; then&lt;br /&gt;
			i=1&lt;br /&gt;
			while [[ -h &amp;quot;$2&amp;quot;/&amp;quot;$bn$i&amp;quot; ]] ; do&lt;br /&gt;
			let &amp;quot;i += 1&amp;quot; &lt;br /&gt;
			done&lt;br /&gt;
			ln -s &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;/&amp;quot;$bn$i&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			ln -s &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	fi&lt;br /&gt;
	if [[ -d $f ]] ; then&lt;br /&gt;
		BornAgainFede &amp;quot;$1&amp;quot;/&amp;quot;$bn&amp;quot; &amp;quot;$2&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
BornAgainFede &amp;quot;$1&amp;quot; &amp;quot;$2&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Versione by Daniele Cortesi:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from sys import argv&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
#controllo se il programma e' stato chiamato correttamente&lt;br /&gt;
if len(argv)&amp;lt;3:&lt;br /&gt;
	print &amp;quot;uso: prog dir1 dir2&amp;quot;&lt;br /&gt;
	exit(1)&lt;br /&gt;
	&lt;br /&gt;
dir1=argv[1]&lt;br /&gt;
dir2=argv[2]&lt;br /&gt;
&lt;br /&gt;
#controllo che gli argomenti siano effettivamente cartelle&lt;br /&gt;
if not os.path.isdir(dir1) or  not os.path.isdir(dir2):&lt;br /&gt;
	print &amp;quot;cartelle non valide&amp;quot;&lt;br /&gt;
	exit(1)&lt;br /&gt;
&lt;br /&gt;
cartelle=[os.getcwd()+&amp;quot;/&amp;quot;+dir1] #lista che conterra' mano a mano tutte le sottocartelle&lt;br /&gt;
files={} #dizionario con nomefile: [lista con tutti i file che si chiamano &amp;quot;nomefile&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
while len(cartelle)&amp;gt;0:&lt;br /&gt;
	c=cartelle.pop() &lt;br /&gt;
	for f in os.listdir(c): #analizzo tutti i file nella cartella c&lt;br /&gt;
		#se f non e' una cartella, allora lo inserisco nel dizionario se non c'e', altrimenti aggiungo il suo percorso alla lista&lt;br /&gt;
		if not os.path.isdir(c+&amp;quot;/&amp;quot;+f):&lt;br /&gt;
			if not files.has_key(f):&lt;br /&gt;
				files[f]=[c+&amp;quot;/&amp;quot;+f]&lt;br /&gt;
			else: files[f].append(c+&amp;quot;/&amp;quot;+f)&lt;br /&gt;
		#se f invece e' una cartella, la aggiungo alla lista cosi' alla prossima iterazione (o dopo in caso di piu' cartelle) verra' analizzata&lt;br /&gt;
		else: cartelle.append(c+&amp;quot;/&amp;quot;+f)&lt;br /&gt;
		&lt;br /&gt;
#creo i link simbolici	&lt;br /&gt;
for k in files.keys():&lt;br /&gt;
	for i,f in enumerate(files[k]):&lt;br /&gt;
		link=k&lt;br /&gt;
		if (i&amp;gt;0): link+=str(i)&lt;br /&gt;
		os.symlink(f, dir2+&amp;quot;/&amp;quot;+link)&lt;br /&gt;
&lt;br /&gt;
exit(0)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Osservazioni==&lt;br /&gt;
Per prima cosa, bel lavoro!&amp;lt;br/&amp;gt;&lt;br /&gt;
Di seguito riporto alcune osservazioni che mi sono venute in mente, prendetele assolutamente con soli fini &amp;quot;costruttivi&amp;quot;! &lt;br /&gt;
* Se non sbaglio, i due programmi (quello di Tommaso e quello di Fede) hanno un comportamento diverso per quanto concerne l'interpretazione del nome file e, in particolare, dell'estensione:&lt;br /&gt;
** Per Tommaso:&lt;br /&gt;
*** dir1/example.pdf --&amp;gt; example&lt;br /&gt;
*** dir1/example.txt --&amp;gt; example1&lt;br /&gt;
*** dir1/dirX/example.pdf --&amp;gt; example2&lt;br /&gt;
** Per Fede:&lt;br /&gt;
*** dir1/example.pdf --&amp;gt; example.pdf&lt;br /&gt;
*** dir1/example.txt --&amp;gt; example.txt&lt;br /&gt;
*** dir1/dirX/example.pdf --&amp;gt; example.pdf1&lt;br /&gt;
** interpretando in modo &amp;quot;stringente&amp;quot; del testo dell'esercizio avrei ipotizzato un comportamento come quello di Fede.&lt;br /&gt;
* Nel codice sorgente c'è in generale poco &amp;quot;commento&amp;quot;. Commentare il codice è essenziale: permette ad altri di capire immediatamente le scelte implementative fatte e permette a voi di capire al volo il perché di queste scelte nel caso dobbiate riprendere in mano il vostro codice dopo un po' di tempo. Quindi: commentate!!!&lt;br /&gt;
* Bash si presta molto all'esercizio&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=188</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=188"/>
		<updated>2013-11-10T23:06:49Z</updated>

		<summary type="html">&lt;p&gt;DaniC: &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;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&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>DaniC</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Stampf_-_implementazione_ridotta_della_printf.&amp;diff=187</id>
		<title>Stampf - implementazione ridotta della printf.</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Stampf_-_implementazione_ridotta_della_printf.&amp;diff=187"/>
		<updated>2013-11-10T23:06:14Z</updated>

		<summary type="html">&lt;p&gt;DaniC: Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;stdarg.h&amp;gt;  char *itos(int n, int *p); //int to string (base 10) int slen(char *s); //string lenght...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char *itos(int n, int *p); //int to string (base 10)&lt;br /&gt;
int slen(char *s); //string lenght&lt;br /&gt;
char *itos0x(int n, int *p); //int to string (base 16)&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * stampf funziona come la printf (viene invocata allo stesso modo) ma riconosce solo alcuni parametri (int, char, stringhe,  void * (qualsiasi puntatore) e il %)&lt;br /&gt;
 * ma non vengono fatti controlli sui tipi, impossibili con va_list che non è in grado di riconosce il tipo (infatti lo prende in input),&lt;br /&gt;
 * per cui se il tipo passato non corrisponde a quello indicato con %, si possono verificare errori a run time di vario tipo&lt;br /&gt;
 * per stampare usa la system call write&lt;br /&gt;
 */&lt;br /&gt;
void stampf(char* s, ...) {&lt;br /&gt;
	int i=0;&lt;br /&gt;
	va_list ap;&lt;br /&gt;
	va_start(ap,s);&lt;br /&gt;
	while (s[i]!='\0'){&lt;br /&gt;
		while (s[i]!='\0' &amp;amp;&amp;amp; s[i]!='%') i++; //raggiungo un % o la fine della stringa&lt;br /&gt;
		if (i&amp;gt;0) write( STDOUT_FILENO, s, i ); //stampo fino al punto raggiunto, escludendo l'eventuale % o \0&lt;br /&gt;
		if (s[i]=='%') {&lt;br /&gt;
			//var temporanee che non è detto vengano utilizzate&lt;br /&gt;
			int n; //usato per i parametri interi, per gli indirizzi e per contenere il num di carattere delle conversioni di questi in stringhe&lt;br /&gt;
			char *str; //usato per le stringhe di cui sopra e per quelle passate come parametro&lt;br /&gt;
			char c[6]=&amp;quot;(nil)&amp;quot;; //nil già pronto (come usa printf) per i puntatori NULL, altrimenti c[0] viene usato per i parametri carattere&lt;br /&gt;
			switch(s[++i]){&lt;br /&gt;
				case 'd':&lt;br /&gt;
					n=va_arg(ap,int);&lt;br /&gt;
					str=itos(n,&amp;amp;n);&lt;br /&gt;
					write(STDOUT_FILENO, str, n );&lt;br /&gt;
					free(str);&lt;br /&gt;
					break;&lt;br /&gt;
				case 's':&lt;br /&gt;
					str=va_arg(ap,char*);&lt;br /&gt;
					write(STDOUT_FILENO, str, slen(str) );&lt;br /&gt;
					break;&lt;br /&gt;
				case 'c':&lt;br /&gt;
					c[0]=va_arg(ap,int); //int perchè va_arg converte i caratteri in interi prima di restituirli&lt;br /&gt;
					write(STDOUT_FILENO, &amp;amp;c[0], 1 );&lt;br /&gt;
					break;&lt;br /&gt;
				case 'p':&lt;br /&gt;
					n=(int)va_arg(ap,void*);&lt;br /&gt;
					if (n==0) write(STDOUT_FILENO, c, 5 ); //stampo (nil)&lt;br /&gt;
					else {&lt;br /&gt;
						str=itos0x(n,&amp;amp;n);&lt;br /&gt;
						write(STDOUT_FILENO, str, n );&lt;br /&gt;
						free(str);&lt;br /&gt;
					}&lt;br /&gt;
					break;&lt;br /&gt;
				case '%':&lt;br /&gt;
					write(STDOUT_FILENO, &amp;amp;s[i], 1 );&lt;br /&gt;
					break;&lt;br /&gt;
			}&lt;br /&gt;
			i++;&lt;br /&gt;
		}&lt;br /&gt;
		s=s+i; //faccio ricominciare la lettura di s o dal carattere successivo a quello dopo il % o dal '\0' e in quest'ultimo caso si uscirà dal ciclo&lt;br /&gt;
		i=0;&lt;br /&gt;
	}&lt;br /&gt;
	va_end(ap);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * itos converte un intero in una stringa allocata dinamicamente&lt;br /&gt;
 * prende in input il numero e un indirizzo (anche null) usato per restituire il numero di caratteri escluso lo '\0' &lt;br /&gt;
 */&lt;br /&gt;
char *itos(int n, int *p) {&lt;br /&gt;
	int ncar=1,tmp=n/10,i,inizio=0;&lt;br /&gt;
	char *s=NULL;&lt;br /&gt;
	while (tmp) { //conto le cifre di n&lt;br /&gt;
		ncar++;&lt;br /&gt;
		tmp/=10;&lt;br /&gt;
	}&lt;br /&gt;
	if (n&amp;lt;0) { //metto il segno&lt;br /&gt;
		ncar++;&lt;br /&gt;
		s=(char*)malloc((ncar+1)*sizeof(char)); //+1 per il carattere terminatore&lt;br /&gt;
		*s='-';&lt;br /&gt;
		inizio=1;&lt;br /&gt;
		n*=-1;&lt;br /&gt;
	}&lt;br /&gt;
	else s=(char*)malloc((ncar+1)*sizeof(char));&lt;br /&gt;
	s[ncar]='\0';&lt;br /&gt;
	for (i=ncar-1; i&amp;gt;=inizio; n/=10, i--) s[i]=(char)(n%10 + 48); //converto la cifra in carattere ascii, 48 è lo zero&lt;br /&gt;
	if (p) *p=ncar;&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * itos0x converte un intero in num esadecimale e lo restituisce come stringa allocata dinamicamente&lt;br /&gt;
 * prende in input il numero e un indirizzo (anche null) usato per restituire il numero di caratteri escluso lo '\0' &lt;br /&gt;
 */&lt;br /&gt;
char *itos0x(int n, int *p){&lt;br /&gt;
	int ncar=0, i,tmp,j;&lt;br /&gt;
	char v[sizeof(int *)*2]; //con un num esadecimale di 2 cifre posso rappresentare un byte, quindi per rappresentarne sizeof(int*) mi servirà al max un vettore grande il doppio&lt;br /&gt;
	char *s; //stringa in output&lt;br /&gt;
	do { //converto il num in esadecimale&lt;br /&gt;
		tmp=n%16;&lt;br /&gt;
		if (tmp&amp;lt;10) v[ncar]=tmp+48;&lt;br /&gt;
		else v[ncar]=tmp-10 + 97; //97 è la a minuscola nella tab ascii&lt;br /&gt;
		n/=16;&lt;br /&gt;
		ncar++;&lt;br /&gt;
	}while (n);&lt;br /&gt;
	s=(char*)malloc((ncar+3)*sizeof(char)); //+3 per il 0x iniziale e lo '\0' finale&lt;br /&gt;
	s[0]='0';&lt;br /&gt;
	s[1]='x';&lt;br /&gt;
	for (i=2, j=ncar-1; i&amp;lt;ncar+2; i++, j--) s[i]=v[j]; //copio v in s in ordine inverso&lt;br /&gt;
	s[i]='\0';&lt;br /&gt;
	if (p) *p=ncar+2;&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * slen restituisce la lunghezza di una stringa escluso lo '\0'&lt;br /&gt;
 */&lt;br /&gt;
int slen(char *s) {&lt;br /&gt;
	int l=0;&lt;br /&gt;
	while (*s++) l++;&lt;br /&gt;
	return l;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Daniele Cortesi&lt;/div&gt;</summary>
		<author><name>DaniC</name></author>
	</entry>
</feed>