<?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=Davide.quadrelli2</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=Davide.quadrelli2"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Davide.quadrelli2"/>
	<updated>2026-05-01T18:02:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_17.06.2014&amp;diff=1134</id>
		<title>Esercizio 1, prova pratica 17.06.2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_17.06.2014&amp;diff=1134"/>
		<updated>2015-05-28T09:58:46Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Occorre scrivere due programmi: mytar myuntar.&lt;br /&gt;
Mytar prende come parametro il nome di una directory e il nome di un file:&lt;br /&gt;
mytar ddd ddd.mytar&lt;br /&gt;
mytar crea il file indicato come secondo parametro e registra in esso tutti i file regolari presenti nella directory (ddd&lt;br /&gt;
nell'esempio). Ogni file e' registrato nel secondo il seguente formato:&lt;br /&gt;
nome del file (stringa ASCII terminata da un byte 0)&lt;br /&gt;
lunghezza del file (stringa ASCII terminata da 0, la lunghezza e' registrata come stringa in rappresentazione in base 10&lt;br /&gt;
per non avere problemi di endianess e di ampiezza dei campi)&lt;br /&gt;
contenuto del file (un numero di byte corrispondente alla lunghezza indicata sopra).&lt;br /&gt;
Myuntar fa l'operazione inversa:&lt;br /&gt;
myuntar ddd.mytar newddd&lt;br /&gt;
crea la directory indicata come secondo parametro e, in essa, tutti i file registrati in ddd.mytar.&lt;br /&gt;
Per provare i due programmi, al termine dell'esecuzione di due comandi simili a quelli degli esempi mostrati qui sopra per&lt;br /&gt;
mytar e myuntar, tutti i file regolari presenti in ddd devono esistere in newddd e devono avere tutti lo stesso contenuto.&lt;br /&gt;
Se create una directory ddd contenente solo file regolare l'output di “diff -R ddd newddd” deve essere vuoto.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Dado==&lt;br /&gt;
mytar e myuntar entrambi funzionanti&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mytar.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX 20&lt;br /&gt;
#define MAXI 1024&lt;br /&gt;
&lt;br /&gt;
/*codice copiato da internet che ipotizzo funzioni :) */&lt;br /&gt;
&lt;br /&gt;
 void reverse(char s[])&lt;br /&gt;
 {&lt;br /&gt;
     int i, j;&lt;br /&gt;
     char c;&lt;br /&gt;
 &lt;br /&gt;
     for (i = 0, j = strlen(s)-1; i&amp;lt;j; i++, j--) {&lt;br /&gt;
         c = s[i];&lt;br /&gt;
         s[i] = s[j];&lt;br /&gt;
         s[j] = c;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
void itoa(int n, char s[])&lt;br /&gt;
 {&lt;br /&gt;
     int i, sign;&lt;br /&gt;
 &lt;br /&gt;
     if ((sign = n) &amp;lt; 0)  /* record sign */&lt;br /&gt;
         n = -n;          /* make n positive */&lt;br /&gt;
     i = 0;&lt;br /&gt;
     do {       /* generate digits in reverse order */&lt;br /&gt;
         s[i++] = n % 10 + '0';   /* get next digit */&lt;br /&gt;
     } while ((n /= 10) &amp;gt; 0);     /* delete it */&lt;br /&gt;
     if (sign &amp;lt; 0)&lt;br /&gt;
         s[i++] = '-';&lt;br /&gt;
     s[i] = '\0';&lt;br /&gt;
     reverse(s);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*mytar*/&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Wrong arguments number\n&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	else{&lt;br /&gt;
		FILE *dest;&lt;br /&gt;
		FILE *temp;&lt;br /&gt;
		DIR *dir;&lt;br /&gt;
		char length[MAX];&lt;br /&gt;
		char *buf_read;&lt;br /&gt;
		char zero='\0';&lt;br /&gt;
		size_t n_readed;&lt;br /&gt;
		struct stat buf;&lt;br /&gt;
		struct dirent *entry;&lt;br /&gt;
		if((dir=opendir(argv[1]))==NULL){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error opendir\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if((dest=fopen(argv[2],&amp;quot;w&amp;quot;))==NULL){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error fopen\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		while((entry=readdir(dir))!=NULL){&lt;br /&gt;
			buf_read=NULL;&lt;br /&gt;
			chdir(argv[1]);&lt;br /&gt;
			if(entry-&amp;gt;d_type==DT_REG){&lt;br /&gt;
				if(stat(entry-&amp;gt;d_name,&amp;amp;buf)==-1){&lt;br /&gt;
					fprintf(stderr, &amp;quot;Error stat\n&amp;quot;);&lt;br /&gt;
					exit(-1);&lt;br /&gt;
				}&lt;br /&gt;
				if((temp=fopen(entry-&amp;gt;d_name,&amp;quot;r&amp;quot;))==NULL){&lt;br /&gt;
					fprintf(stderr, &amp;quot;Error fopen_temp\n&amp;quot;);&lt;br /&gt;
					exit(-1);&lt;br /&gt;
				}&lt;br /&gt;
				write(fileno(dest),entry-&amp;gt;d_name,strlen(entry-&amp;gt;d_name)+1);&lt;br /&gt;
				itoa(buf.st_size-1,length);&lt;br /&gt;
				write(fileno(dest),length,strlen(length)+1);&lt;br /&gt;
				/*scrivere dati*/&lt;br /&gt;
				while(getdelim(&amp;amp;buf_read,&amp;amp;n_readed,EOF,temp)&amp;gt;0){&lt;br /&gt;
					write(fileno(dest),buf_read,strlen(buf_read)-1);&lt;br /&gt;
				}&lt;br /&gt;
				free(buf_read);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;File mytar creato con successo!\n&amp;quot;);&lt;br /&gt;
		return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
myuntar.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Wrong arguments number\n&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}else{&lt;br /&gt;
		FILE *mytar;&lt;br /&gt;
		FILE *tmp;&lt;br /&gt;
		char nome[256];&lt;br /&gt;
		int dim, i;&lt;br /&gt;
		char readed[2],length[20];&lt;br /&gt;
		nome[0]=length[0]=0;&lt;br /&gt;
		readed[1]=0;&lt;br /&gt;
		if(mkdir(argv[2],(mode_t)0777)==-1){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error mkdir\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if((mytar=fopen(argv[1],&amp;quot;r&amp;quot;))==NULL){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error fopen\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if(chdir(argv[2])==-1){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Errore chdir\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		while((fread(&amp;amp;readed,1,1,mytar))){&lt;br /&gt;
			strcat(nome,readed);&lt;br /&gt;
			while((fread(&amp;amp;readed,1,1,mytar))){&lt;br /&gt;
				if(readed[0]=='\0') break;&lt;br /&gt;
				strcat(nome,readed);&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;Nome trovato: %s\n&amp;quot;,nome);&lt;br /&gt;
			if((tmp=fopen(nome,&amp;quot;w&amp;quot;))==NULL){&lt;br /&gt;
				fprintf(stderr, &amp;quot;Error fopen files\n&amp;quot;);&lt;br /&gt;
				exit(-1);&lt;br /&gt;
			}&lt;br /&gt;
			while((fread(&amp;amp;readed,1,1,mytar))){&lt;br /&gt;
				if(readed[0]=='\0') break;&lt;br /&gt;
				strcat(length,readed);&lt;br /&gt;
			}&lt;br /&gt;
			dim=atoi(length);&lt;br /&gt;
			printf(&amp;quot;Lunghezza trovata: %s\n&amp;quot;,length);&lt;br /&gt;
			for(i=0; i&amp;lt;dim; i++){&lt;br /&gt;
				fread(&amp;amp;readed,1,1,mytar);&lt;br /&gt;
				write(fileno(tmp),&amp;amp;readed,1);&lt;br /&gt;
			}&lt;br /&gt;
		fclose(tmp);&lt;br /&gt;
		nome[0]=0;&lt;br /&gt;
		length[0]=0;&lt;br /&gt;
		}&lt;br /&gt;
	fclose(mytar);&lt;br /&gt;
	printf(&amp;quot;File myuntar scompattato correttamente, credo\n&amp;quot;);&lt;br /&gt;
	return 0;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di MV ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Per ora ho fatto solo la prima parte, cioè mytar.&lt;br /&gt;
L'unico problema che non riesco a capire è che entra in un loop infinito (scrivendo all'infinito sul file che crea!) se viene usato nella cartella dell'eseguibile stesso...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*-------------------------------------MYTAR.C--------------------------------------------*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUF_DIM 512&lt;br /&gt;
&lt;br /&gt;
/* scrive nome, dimensione e contenuto del file indicato da src nel file dest (già aperto in scrittura) */&lt;br /&gt;
int filecpy(const char *src, const int dest, off_t size);&lt;br /&gt;
&lt;br /&gt;
/* ---------------------------------- MAIN ------------------------------- */&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{	&lt;br /&gt;
	DIR *ddd;&lt;br /&gt;
	int f;&lt;br /&gt;
	struct dirent *entry;&lt;br /&gt;
	struct stat dest_st;&lt;br /&gt;
	int e,i,len;&lt;br /&gt;
	char buf[BUF_DIM];&lt;br /&gt;
	&lt;br /&gt;
	if(argc != 3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error: needed 2 parameters\n&amp;quot;);&lt;br /&gt;
		return 1;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	umask(0001);&lt;br /&gt;
	/* Creo il file passato come secondo parametro */&lt;br /&gt;
	if((f = open(argv[2], O_WRONLY|O_CREAT|O_TRUNC, 0666)) == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error in open(): %s (%i)\n&amp;quot;,strerror(errno),errno);&lt;br /&gt;
		return errno;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* Apro la directory passata come primo parametro, se c'è */&lt;br /&gt;
	if((ddd = opendir(argv[1])) == NULL)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error in opendir(%s): %s (%i)\n&amp;quot;,argv[1],strerror(errno),errno);&lt;br /&gt;
		return errno;&lt;br /&gt;
	}&lt;br /&gt;
	/* mi sposto in quella directory */&lt;br /&gt;
	if(chdir(argv[1]) == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error in chdir(%s): %s (%i)\n&amp;quot;,argv[1],strerror(errno),errno);&lt;br /&gt;
		return errno;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	e = errno;&lt;br /&gt;
	i = 0;	/* in i mantengo il numero totale di file copiati */&lt;br /&gt;
	/* leggo lo stat del file che ho creato */&lt;br /&gt;
	if(fstat(f, &amp;amp;dest_st) == -1)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error in stat(%s): %s (%i)\n&amp;quot;,buf,strerror(errno),errno);&lt;br /&gt;
		return errno;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* leggo le entry della directory finchè ce ne sono */&lt;br /&gt;
	while((entry = readdir(ddd)) != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		struct stat st;&lt;br /&gt;
		&lt;br /&gt;
		strcpy(buf, entry-&amp;gt;d_name);&lt;br /&gt;
		&lt;br /&gt;
		if(stat(buf, &amp;amp;st) == -1)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Error in stat(%s): %s (%i)\n&amp;quot;,buf,strerror(errno),errno);&lt;br /&gt;
			return errno;&lt;br /&gt;
		}&lt;br /&gt;
		else if(st.st_mode &amp;amp; S_IFREG)	/* è un file */&lt;br /&gt;
		{	&lt;br /&gt;
			/* verifico che il file in questione sia diverso da quello aperto in scrittura, per evitare che scriva su se stesso all'infinito */&lt;br /&gt;
			if((st.st_ino == dest_st.st_ino) &amp;amp;&amp;amp; (st.st_rdev == dest_st.st_rdev))&lt;br /&gt;
				continue;&lt;br /&gt;
			&lt;br /&gt;
			if(filecpy(buf, f, st.st_size) == -1)&lt;br /&gt;
			{&lt;br /&gt;
				printf(&amp;quot;Error in filecpy(%s, %i)\n&amp;quot;,buf,f);&lt;br /&gt;
				return -1;&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;%s inserito.\n&amp;quot;, buf);&lt;br /&gt;
			i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if(e != errno)	/* sono uscito dal ciclo a causa di un errore */&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Error in readdir(): %s (%i)\n&amp;quot;,strerror(errno),errno);&lt;br /&gt;
		return errno;			&lt;br /&gt;
	}&lt;br /&gt;
	else	/* perchè ho visitato tutte le entrate della directory */&lt;br /&gt;
		printf(&amp;quot;end of directory, %i entry found.\n&amp;quot;, i);&lt;br /&gt;
	&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int filecpy(const char *src, const int dest, off_t size)&lt;br /&gt;
{&lt;br /&gt;
	/* NB: dest è già aperto in scrittura */&lt;br /&gt;
	int s, len, tot;&lt;br /&gt;
	char buf[BUF_DIM];&lt;br /&gt;
	&lt;br /&gt;
	if((s = open(src,O_RDONLY,0)) == -1)	/* apro src in lettura */&lt;br /&gt;
		return -1;&lt;br /&gt;
	&lt;br /&gt;
	tot = write(dest, src, strlen(src)+1);	/* per prima cosa copio il titolo del file src */&lt;br /&gt;
							/* NB: faccio tot+1 per copiare anche lo 0 terminatore */&lt;br /&gt;
	sprintf(buf, &amp;quot;%i&amp;quot;, (int)size);	/* poi copio la dimensione */&lt;br /&gt;
	tot += write(dest, buf, strlen(buf)+1);&lt;br /&gt;
	&lt;br /&gt;
	/* infine copio tutto il contenuto */&lt;br /&gt;
	while( (len = read(s,buf,BUF_DIM)) != 0)&lt;br /&gt;
	{&lt;br /&gt;
		if(len == -1)&lt;br /&gt;
		{&lt;br /&gt;
			printf(&amp;quot;Error in read(): %s (%i)\n&amp;quot;,strerror(errno),errno);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
		/*else printf(&amp;quot;%i\n&amp;quot;,len);*/&lt;br /&gt;
		tot += write(dest, buf, len);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return tot;	/* restituisce il numero totale di byte scritti */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_2014.05.29&amp;diff=1133</id>
		<title>Prova pratica 2014.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_2014.05.29&amp;diff=1133"/>
		<updated>2015-05-28T09:55:09Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Scrivere un programma con un solo parametro. Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la directory...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma con un solo parametro.&lt;br /&gt;
Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la directory esiste gia' o si&lt;br /&gt;
verifica un errore nella creazione, il programma deve terminare. Chiameremo questa directory “directory-base”&lt;br /&gt;
Il programma usando inotify rimane in attesa e stampa una riga di log per ogni file o directory creato o cancellato nella&lt;br /&gt;
directory-base. (solo nella directory-base, non nelle sottodirectory).&lt;br /&gt;
Quando viene cancellata la directory-base il programma termina.&lt;br /&gt;
&lt;br /&gt;
Si estenda il programma dell'esercizio 1 per operare anche nelle sottodirectory. Quindi il programma “dovrebbe” stampare una&lt;br /&gt;
riga di log per ogni file o directory creata o cancellata in tutto il sottoalbero che ha nella directory-base la radice.&lt;br /&gt;
Nota: se necessario, usate strutture dati molto semplici come vettori o liste semplici, non preoccupatevi dell'efficienza.&lt;br /&gt;
In realta' per un problema nel design dell'API inotify, alcuni eventi di creazione di directory nidificate troppo vicini nel tempo&lt;br /&gt;
possono venir perduti.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Dado==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
int spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else return spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
int spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR){&lt;br /&gt;
          				int pid;&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          				pid=fork();&lt;br /&gt;
          				if(!pid){&lt;br /&gt;
          					char *newpath=malloc((strlen(path))+event-&amp;gt;len+1); /*sommo 1 alla fine per lo /*/&lt;br /&gt;
          					strcpy(newpath,path);&lt;br /&gt;
          					strcat(newpath,&amp;quot;/&amp;quot;);&lt;br /&gt;
          					strcat(newpath,event-&amp;gt;name);&lt;br /&gt;
          					return spy(newpath);&lt;br /&gt;
          				}&lt;br /&gt;
        			}&lt;br /&gt;
        			else&lt;br /&gt;
          				printf(&amp;quot;File %s creato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(!(event-&amp;gt;mask &amp;amp; IN_ISDIR))&lt;br /&gt;
          				printf(&amp;quot;File %s eliminato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella %s eliminata.\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1132</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=1132"/>
		<updated>2015-05-28T09:50:40Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2014&amp;diff=1131</id>
		<title>Esercizio 1, prova pratica 29.05.2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_29.05.2014&amp;diff=1131"/>
		<updated>2015-05-28T09:50:03Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma con un solo parametro.&lt;br /&gt;
Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la directory esiste gia' o si&lt;br /&gt;
verifica un errore nella creazione, il programma deve terminare. Chiameremo questa directory “directory-base”&lt;br /&gt;
Il programma usando inotify rimane in attesa e stampa una riga di log per ogni file o directory creato o cancellato nella&lt;br /&gt;
directory-base. (solo nella directory-base, non nelle sottodirectory).&lt;br /&gt;
Quando viene cancellata la directory-base il programma termina. &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg==&lt;br /&gt;
&amp;lt;source lang='c'&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE  ( sizeof (struct inotify_event) )&lt;br /&gt;
#define EVENT_BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv []) {&lt;br /&gt;
&lt;br /&gt;
	int stat, fd, wd, length, i = 0;&lt;br /&gt;
	char *directory_base = argv[1];	&lt;br /&gt;
	char buffer[EVENT_BUF_LEN];&lt;br /&gt;
	int boolean = 1;&lt;br /&gt;
&lt;br /&gt;
	/* Make the directory */&lt;br /&gt;
	stat = mkdir(argv[1], S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);&lt;br /&gt;
	&lt;br /&gt;
	/* Checking for error */&lt;br /&gt;
	if (stat != 0) {&lt;br /&gt;
		perror (&amp;quot;Error directory is not create&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	/* Creating the INOTIFY instance */&lt;br /&gt;
  	fd = inotify_init();&lt;br /&gt;
&lt;br /&gt;
  	/* Checking for error */&lt;br /&gt;
  	if ( fd &amp;lt; 0 ) {&lt;br /&gt;
    		perror(&amp;quot;Error in inotify_init&amp;quot;);&lt;br /&gt;
  	}&lt;br /&gt;
&lt;br /&gt;
  	/* Adding the directory into watch list. &lt;br /&gt;
           Here, the suggestion is to validate the existence of the directory before adding into monitoring list. */&lt;br /&gt;
  	wd = inotify_add_watch(fd, directory_base, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
&lt;br /&gt;
	/* It continue until directory-base exist */&lt;br /&gt;
	while (boolean != 0) {&lt;br /&gt;
&lt;br /&gt;
	  	/* Read to determine the event change happens on the directory. &lt;br /&gt;
		   Actually this read blocks until the change event occurs. */ &lt;br /&gt;
		length = read(fd, buffer, EVENT_BUF_LEN); &lt;br /&gt;
&lt;br /&gt;
	  	/* Checking for error */&lt;br /&gt;
	  	if ( length &amp;lt; 0 ) {&lt;br /&gt;
	   		 perror(&amp;quot;Error in read&amp;quot;);&lt;br /&gt;
	  	}  &lt;br /&gt;
&lt;br /&gt;
	  	/* Actually read return the list of change events happens. &lt;br /&gt;
		   Here, read the change event one by one and process it accordingly. */&lt;br /&gt;
	  	while (i &amp;lt; length) {    &lt;br /&gt;
	 &lt;br /&gt;
			struct inotify_event *event = (struct inotify_event*) &amp;amp;buffer[i];   &lt;br /&gt;
	  &lt;br /&gt;
			if (event-&amp;gt;len) {&lt;br /&gt;
&lt;br /&gt;
				if (event-&amp;gt;mask &amp;amp; IN_CREATE) {&lt;br /&gt;
&lt;br /&gt;
		     			if (event-&amp;gt;mask &amp;amp; IN_ISDIR) {&lt;br /&gt;
			 			printf(&amp;quot;New directory %s created.\n&amp;quot;, event-&amp;gt;name);&lt;br /&gt;
		       			}&lt;br /&gt;
					else {&lt;br /&gt;
			  			printf(&amp;quot;New file %s created.\n&amp;quot;, event-&amp;gt;name);&lt;br /&gt;
					}&lt;br /&gt;
                                        break;&lt;br /&gt;
		      	        }&lt;br /&gt;
		      		else if (event-&amp;gt;mask &amp;amp; IN_DELETE) {&lt;br /&gt;
&lt;br /&gt;
					if (event-&amp;gt;mask &amp;amp; IN_ISDIR) {&lt;br /&gt;
			  			printf( &amp;quot;Directory %s deleted.\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
					}&lt;br /&gt;
					else {&lt;br /&gt;
			  			printf(&amp;quot;File %s deleted.\n&amp;quot;, event-&amp;gt;name);&lt;br /&gt;
					}&lt;br /&gt;
                                        break;&lt;br /&gt;
		      		}&lt;br /&gt;
				/* Removing the directory */&lt;br /&gt;
				else if (event-&amp;gt;mask &amp;amp; IN_DELETE_SELF) {&lt;br /&gt;
                                        boolean = 0;&lt;br /&gt;
					printf( &amp;quot;Directory %s deleted.\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
	    		}&lt;br /&gt;
	    		i += EVENT_SIZE + event-&amp;gt;len;&lt;br /&gt;
		}	&lt;br /&gt;
	}&lt;br /&gt;
	/* Removing the directory from the watch list */&lt;br /&gt;
   	inotify_rm_watch(fd, wd);&lt;br /&gt;
&lt;br /&gt;
  	/* Closing the INOTIFY instance */&lt;br /&gt;
   	close(fd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Dado==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang='c'&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
void spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
void spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE) {&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s creato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s eliminata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s eliminato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella in listening %s eliminata\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_30-05-11&amp;diff=1130</id>
		<title>Esercizio 1 Prova Pratica 30-05-11</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_30-05-11&amp;diff=1130"/>
		<updated>2015-05-28T09:45:30Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Scrivere due programmi in modo che i parametri passati al primo vengano stampati dal secondo. La comunicazione deve avvenire tramite una shared memory rea...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere due programmi in modo che i parametri passati al&lt;br /&gt;
primo vengano stampati dal secondo. La comunicazione deve avvenire tramite una shared memory realizzata&lt;br /&gt;
con la chiamata POSIX shm_open, la sincronizzazione tramite segnali. Viene attivato per primo il programma&lt;br /&gt;
ricevente. (anche i pid dei processi possono venir scambiati attraverso la shared memory!).&lt;br /&gt;
Es: scrivere in un terminale:&lt;br /&gt;
$./receiver&lt;br /&gt;
l'esecuzione di “receiver rimane in attesa”. in un secondo terminale scrivere:&lt;br /&gt;
$./sender a bb ccc&lt;br /&gt;
nel primo deve comparire&lt;br /&gt;
./sender&lt;br /&gt;
a&lt;br /&gt;
bb&lt;br /&gt;
ccc&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Dado e Pierg==&lt;br /&gt;
&lt;br /&gt;
sender.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt; &lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	int fd,i;&lt;br /&gt;
	fd=shm_open(&amp;quot;/shared&amp;quot;,O_RDWR,'w');&lt;br /&gt;
	if(fd==-1){&lt;br /&gt;
		fprintf(stderr,&amp;quot;Error while opening the shared memory\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
	for(i=0;i&amp;lt;argc;i++){&lt;br /&gt;
		write(fd,argv[i],sizeof(argv[i]));&lt;br /&gt;
		write(fd,&amp;quot;\n&amp;quot;,1);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
receiver.c&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt; &lt;br /&gt;
#define MAXLENGTH 1024&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	int fd;&lt;br /&gt;
	ssize_t dim;&lt;br /&gt;
	char buff[MAXLENGTH];&lt;br /&gt;
	fd=shm_open(&amp;quot;/shared&amp;quot;,O_RDWR,'r');&lt;br /&gt;
	while((dim=read(fd,&amp;amp;buff,MAXLENGTH))){&lt;br /&gt;
		write(stdout,buff,MAXLENGTH);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1129</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=1129"/>
		<updated>2015-05-28T09:42:06Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Linker_fisico_(Prova_pratica_20-02-2014)&amp;diff=1101</id>
		<title>Linker fisico (Prova pratica 20-02-2014)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Linker_fisico_(Prova_pratica_20-02-2014)&amp;diff=1101"/>
		<updated>2015-05-17T15:14:17Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il comando che dovrete implementare come script shell o programma python e' linkdir. linkdir prende due directory come parametri.&lt;br /&gt;
&lt;br /&gt;
linkdir dira dirb&lt;br /&gt;
&lt;br /&gt;
e deve creare in dirb un link fisico (non simbolico) a tutti i file regolari che sono in dira e non in dirb. Se un file regolare e'&lt;br /&gt;
presente con lo stesso nome sia in dira sia in dirb, nella directory dirb deve rim&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Claudio Kerov===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/local/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ -d $1 ]]; then&lt;br /&gt;
	if [[ -d $2 ]]; then&lt;br /&gt;
		dir1=$1&lt;br /&gt;
		dir2=$2&lt;br /&gt;
	fi&lt;br /&gt;
fi &lt;br /&gt;
&lt;br /&gt;
ris1=`find $dir1 -type f | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
ris2=`find $dir2 -type f | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
indir1=`comm -2 -3 &amp;lt;(echo &amp;quot;$ris1&amp;quot;) &amp;lt;(echo &amp;quot;$ris2&amp;quot;)`&lt;br /&gt;
common=`comm -1 -2 &amp;lt;(echo &amp;quot;$ris1&amp;quot;) &amp;lt;(echo &amp;quot;$ris2&amp;quot;)`&lt;br /&gt;
&lt;br /&gt;
for nome in $indir1; do&lt;br /&gt;
	`ln ${dir1}/${nome} $dir2`&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for file in $common; do&lt;br /&gt;
	if [[ &amp;quot;${dir1}${file}&amp;quot; -ot &amp;quot;${dir2}${file}&amp;quot; ]]; then&lt;br /&gt;
		`ln ${dir1}/${file} $dir2`&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Maldus===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import argparse&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    parser = argparse.ArgumentParser(description='linkdir')&lt;br /&gt;
    parser.add_argument('dira', help='directory aggiornata')&lt;br /&gt;
    parser.add_argument('dirb', help='directory da aggiornare')&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    entrya = os.listdir(args.dira)&lt;br /&gt;
    entryb = os.listdir(args.dirb)&lt;br /&gt;
    for f in entrya:&lt;br /&gt;
        if os.path.isfile(args.dira+'/'+f) and not f in entryb:&lt;br /&gt;
            os.link( args.dira+'/'+f , args.dirb+'/'+f )&lt;br /&gt;
        else:&lt;br /&gt;
            timea = os.path.getmtime(args.dira+'/'+f)&lt;br /&gt;
            timeb = os.path.getmtime(args.dirb+'/'+f)&lt;br /&gt;
            if timea &amp;gt; timeb:&lt;br /&gt;
                os.link( args.dira+'/'+f , args.dirb+'/'+f )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Linker_fisico_(Prova_pratica_20-02-2014)&amp;diff=1100</id>
		<title>Linker fisico (Prova pratica 20-02-2014)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Linker_fisico_(Prova_pratica_20-02-2014)&amp;diff=1100"/>
		<updated>2015-05-17T15:14:01Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.02.20&amp;diff=1099</id>
		<title>Prova Pratica 2014.02.20</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.02.20&amp;diff=1099"/>
		<updated>2015-05-17T15:13:50Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;==Es. 1== &amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Scrivere   un   programma   in   C   “colonnan”   che   prenda   come   parametro   il   pathname   di   un   file e   un   numero   intero ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Es. 1==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere   un   programma   in   C   “colonnan”   che   prenda   come   parametro   il   pathname   di   un   file&lt;br /&gt;
e   un   numero   intero   (che chiameremo n). Il programma deve stampare come output il numero di caratteri presenti &lt;br /&gt;
nella n-ma colonna del file se il file e' un file regolare di testo, non deve stampare nulla negli altri casi.&lt;br /&gt;
Un file viene considerato di testo se tutti i suoi byte hanno valori compresi nel range 1-127. Per controllare se il &lt;br /&gt;
file e' “regolare” usare la system call lstat.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di Dado===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		printf(&amp;quot;colonnan: 1st parameter is the pathname, the 2nd is the integer n\n&amp;quot;);&lt;br /&gt;
	}else{&lt;br /&gt;
		struct stat info;&lt;br /&gt;
		int ch,i=0,ret=0;&lt;br /&gt;
		FILE *f;&lt;br /&gt;
		int res=lstat(argv[1],&amp;amp;info);&lt;br /&gt;
		int n=atoi(argv[2]);&lt;br /&gt;
		if(n&amp;lt;=0){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error: insert a number &amp;gt;0\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if(res){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error: lstat\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if(S_ISREG(info.st_mode)){&lt;br /&gt;
			f=fopen(argv[1],&amp;quot;r&amp;quot;);&lt;br /&gt;
			if(!f){&lt;br /&gt;
				fprintf(stderr, &amp;quot;Error: fopen\n&amp;quot;);&lt;br /&gt;
				exit(-1);&lt;br /&gt;
			}&lt;br /&gt;
			while((ch=getc(f))!=EOF){&lt;br /&gt;
				if(ch &amp;gt;=1 &amp;amp;&amp;amp; ch &amp;lt;= 127){&lt;br /&gt;
					if(ch==(char)'\n')i=0;&lt;br /&gt;
					else{&lt;br /&gt;
						i++;&lt;br /&gt;
						if(i==n) ret++;&lt;br /&gt;
					}&lt;br /&gt;
				}else{&lt;br /&gt;
					fprintf(stderr, &amp;quot;Error: not a text file\n&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;Result: %d\n&amp;quot;,ret);&lt;br /&gt;
		}else{&lt;br /&gt;
			fprintf(stderr, &amp;quot;File is not a regular file\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Es. 2==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Si scriva un programma C chiamato “colonnandir”. Il risultato del programma, stampato su standard output, deve essere un&lt;br /&gt;
solo numero intero: la somma del numero di caratteri presenti nelle n-me colonne di tutti i file regolari, di testo, non nascosti (il&lt;br /&gt;
primo carattere deve essere diverso da punto) della directory passata come parametro, ovvero della directory corrente se&lt;br /&gt;
colonnandir viene lanciato senza specificare parametri.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di Dado===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
int count_col(char *path, int n){&lt;br /&gt;
	int ch,i=0,ret=0;&lt;br /&gt;
	FILE *f;&lt;br /&gt;
	f=fopen(path,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if(!f){&lt;br /&gt;
		fprintf(stderr, &amp;quot;Error: fopen\n&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	while((ch=getc(f))!=EOF){&lt;br /&gt;
		if(ch &amp;gt;=1 &amp;amp;&amp;amp; ch &amp;lt;= 127){&lt;br /&gt;
			if(ch==(char)'\n')i=0;&lt;br /&gt;
			else{&lt;br /&gt;
				i++;&lt;br /&gt;
				if(i==n) ret++;&lt;br /&gt;
			}&lt;br /&gt;
		}else{&lt;br /&gt;
			return 0;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return ret;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		printf(&amp;quot;colonnan: 1st parameter is the dir-name, the 2nd is the integer n\n&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}else{&lt;br /&gt;
		DIR *d;&lt;br /&gt;
		int tot=0;&lt;br /&gt;
		struct dirent *file;&lt;br /&gt;
		int n=atoi(argv[2]);&lt;br /&gt;
		d=opendir(argv[1]);&lt;br /&gt;
		if(d==NULL){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error: open directory\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		if(n&amp;lt;=0){&lt;br /&gt;
			fprintf(stderr, &amp;quot;Error: insert a number &amp;gt;0\n&amp;quot;);&lt;br /&gt;
			exit(-1);&lt;br /&gt;
		}&lt;br /&gt;
		chdir(argv[1]);&lt;br /&gt;
		while((file=readdir(d))!=NULL){&lt;br /&gt;
			if(file-&amp;gt;d_name[0]!='.' &amp;amp;&amp;amp; file-&amp;gt;d_type==DT_REG){&lt;br /&gt;
				tot+=count_col(file-&amp;gt;d_name,n);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		printf(&amp;quot;Result: %d\n&amp;quot;,tot);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Es. 3==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Il comando che dovrete implementare come script shell o programma python e' linkdir. linkdir prende due directory come&lt;br /&gt;
parametri.&lt;br /&gt;
linkdir dira dirb&lt;br /&gt;
e deve creare in dirb un link fisico (non simbolico) a tutti i file regolari che sono in dira e non in dirb. Se un file regolare e'&lt;br /&gt;
presente con lo stesso nome sia in dira sia in dirb, nella directory dirb deve rimanere il file originariamente presente  se e' piu'&lt;br /&gt;
recente di quello in dira altrimenti un link al file di dira con lo stesso nome.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di Dado===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
if [[ -n $1 ]]; then&lt;br /&gt;
	if [[ -n $2 ]]; then&lt;br /&gt;
		files=`ls $1`&lt;br /&gt;
		for file in $files; do&lt;br /&gt;
			if [[ -f $1/$file ]]; then&lt;br /&gt;
				if [[ -e $2/$file ]]; then&lt;br /&gt;
					if [[ $1/$file -nt $2/$file ]]; then&lt;br /&gt;
						ln -P -f $1/$file $2/$file&lt;br /&gt;
					fi&lt;br /&gt;
				else&lt;br /&gt;
					ln -P $1/$file $2/$file&lt;br /&gt;
				fi&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
	fi&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di Claudio Kerov===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/local/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ -d $1 ]]; then&lt;br /&gt;
	if [[ -d $2 ]]; then&lt;br /&gt;
		dir1=$1&lt;br /&gt;
		dir2=$2&lt;br /&gt;
	fi&lt;br /&gt;
fi &lt;br /&gt;
&lt;br /&gt;
ris1=`find $dir1 -type f | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
ris2=`find $dir2 -type f | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
indir1=`comm -2 -3 &amp;lt;(echo &amp;quot;$ris1&amp;quot;) &amp;lt;(echo &amp;quot;$ris2&amp;quot;)`&lt;br /&gt;
common=`comm -1 -2 &amp;lt;(echo &amp;quot;$ris1&amp;quot;) &amp;lt;(echo &amp;quot;$ris2&amp;quot;)`&lt;br /&gt;
&lt;br /&gt;
for nome in $indir1; do&lt;br /&gt;
	`ln ${dir1}/${nome} $dir2`&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for file in $common; do&lt;br /&gt;
	if [[ &amp;quot;${dir1}${file}&amp;quot; -ot &amp;quot;${dir2}${file}&amp;quot; ]]; then&lt;br /&gt;
		`ln ${dir1}/${file} $dir2`&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Soluzione di Maldus===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import argparse&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    parser = argparse.ArgumentParser(description='linkdir')&lt;br /&gt;
    parser.add_argument('dira', help='directory aggiornata')&lt;br /&gt;
    parser.add_argument('dirb', help='directory da aggiornare')&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    entrya = os.listdir(args.dira)&lt;br /&gt;
    entryb = os.listdir(args.dirb)&lt;br /&gt;
    for f in entrya:&lt;br /&gt;
        if os.path.isfile(args.dira+'/'+f) and not f in entryb:&lt;br /&gt;
            os.link( args.dira+'/'+f , args.dirb+'/'+f )&lt;br /&gt;
        else:&lt;br /&gt;
            timea = os.path.getmtime(args.dira+'/'+f)&lt;br /&gt;
            timeb = os.path.getmtime(args.dirb+'/'+f)&lt;br /&gt;
            if timea &amp;gt; timeb:&lt;br /&gt;
                os.link( args.dira+'/'+f , args.dirb+'/'+f )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1098</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=1098"/>
		<updated>2015-05-17T15:06:31Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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 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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2012.05.30&amp;diff=1090</id>
		<title>Prova Pratica 2012.05.30</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2012.05.30&amp;diff=1090"/>
		<updated>2015-05-12T10:18:20Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Soluzione di Dado e Pierg==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un minimake, cioe' una versione minimale del programma make.&lt;br /&gt;
Questo programma legge il file minimakefile nella directory corrente che ha il seguente formato:&lt;br /&gt;
target: comando&lt;br /&gt;
Il minimakefile e' scritto in modo che se le dipendenze sono generate da regole del minimakefile queste vengano definite&lt;br /&gt;
prima. Ad esempio il minimakefile per compilare ed eseguire il programma hw.c (hello world) sara':&lt;br /&gt;
hw.o: gcc -c hw.c&lt;br /&gt;
hw: gcc -o hw hw.o&lt;br /&gt;
run: ./hw&lt;br /&gt;
minimake deve scorrere il minimakefile, se il file indicato come target non esiste esegue il comando (e' vietato l'uso di popen,&lt;br /&gt;
system e simili!)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;s2argv/s2argv.h&amp;quot;&lt;br /&gt;
#define MAKEFILE &amp;quot;minimakefile&amp;quot;&lt;br /&gt;
#define RUN &amp;quot;run&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	FILE *mf;&lt;br /&gt;
	char *line=NULL;&lt;br /&gt;
	char *target,*command;&lt;br /&gt;
	int dim=0;&lt;br /&gt;
	mf=fopen(MAKEFILE,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if(mf==NULL){&lt;br /&gt;
		fprintf(stderr,&amp;quot;minimakefile not found!\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	while(getline(&amp;amp;line,&amp;amp;dim,mf)&amp;gt;0){&lt;br /&gt;
		target=strtok(line,&amp;quot;:&amp;quot;);&lt;br /&gt;
		command=strtok(NULL,&amp;quot;\n&amp;quot;);&lt;br /&gt;
		if(strcmp(target,RUN)==0){&lt;br /&gt;
			system_noshell(command);&lt;br /&gt;
		}&lt;br /&gt;
		else if(fopen(target,&amp;quot;r&amp;quot;)==NULL){&lt;br /&gt;
			system_noshell(command);&lt;br /&gt;
		}&lt;br /&gt;
        else{&lt;br /&gt;
			fprintf(stderr,&amp;quot;target %s già esistente: non eseguo\n&amp;quot;,target);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	free(line);&lt;br /&gt;
	fclose(mf);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
la sintassi del minimakefile per l'esercizio2 deve prevedere le dipendenze come il vero makefile.&lt;br /&gt;
target: dependence1 dependence2&lt;br /&gt;
comando&lt;br /&gt;
comando&lt;br /&gt;
(come per il makefile il target viene scritto a inizio linea, i comandi hanno un tab come primo carattere)&lt;br /&gt;
es per compilare hw.c.&lt;br /&gt;
hw.o: hw.c&lt;br /&gt;
gcc -c hw.c&lt;br /&gt;
hw: hw.o&lt;br /&gt;
gcc -o hw hw.o&lt;br /&gt;
run: hw&lt;br /&gt;
hw&lt;br /&gt;
in questo caso occorre eseguire i comandi che seguono la regola di dipendenza solo se il file target non esiste o&lt;br /&gt;
se un file indicato come dipendenza e' stato modificato piu' recentemente del target.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;quot;s2argv/s2argv.h&amp;quot;&lt;br /&gt;
#define MAKEFILE &amp;quot;minimakefile&amp;quot;&lt;br /&gt;
#define RUN &amp;quot;run&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	FILE *mf;&lt;br /&gt;
	char *line=NULL;&lt;br /&gt;
	char *target, *tmp;&lt;br /&gt;
	int dim = 0;&lt;br /&gt;
    int a = b = 0;&lt;br /&gt;
    struct stat st_target, st_tmp;&lt;br /&gt;
    &lt;br /&gt;
	mf=fopen(MAKEFILE,&amp;quot;r&amp;quot;);&lt;br /&gt;
	if(fd==NULL){&lt;br /&gt;
		fprintf(stderr,&amp;quot;minimakefile not found!\n&amp;quot;);&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
	while(getline(&amp;amp;line,&amp;amp;dim,mf)&amp;gt;0){&lt;br /&gt;
        if (line[0] == &amp;quot;\t&amp;quot;) {&lt;br /&gt;
            if(a || b){&lt;br /&gt;
                system_noshell(line + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
		else{&lt;br /&gt;
			a = b = 0;&lt;br /&gt;
            target = strtok(line, &amp;quot;:&amp;quot;)&lt;br /&gt;
            if(fopen(target,&amp;quot;r&amp;quot;)==NULL){&lt;br /&gt;
                a = 1;&lt;br /&gt;
		    }&lt;br /&gt;
            else if(strcmp(target,RUN)==0){&lt;br /&gt;
                char *command = strtok(NULL, &amp;quot;\n&amp;quot;);&lt;br /&gt;
                system_noshell(command);&lt;br /&gt;
		    }&lt;br /&gt;
            else {&lt;br /&gt;
                stat(target, &amp;amp;st_target);&lt;br /&gt;
                while ((tmp = (strtok(NULL, &amp;quot; &amp;quot;))!=NULL){&lt;br /&gt;
                    stat(tmp, &amp;amp;st_tmp);&lt;br /&gt;
                    if (st_tmp.st_mtime &amp;gt; st_target.st_mtime ) {&lt;br /&gt;
                        b = 1;&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	free(line);&lt;br /&gt;
	fclose(fd);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3_Prova_Pratica_30-05-2012&amp;diff=1080</id>
		<title>Esercizio 3 Prova Pratica 30-05-2012</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3_Prova_Pratica_30-05-2012&amp;diff=1080"/>
		<updated>2015-05-10T16:33:34Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Lo script o il programma python prende il nome di una directory come parametro e deve listare i file nella directory che hanno&lt;br /&gt;
un file corrispondente con nome scritto al contrario (il file ailati deve essere nella lista solo se nella directory c'e' anche italia, i&lt;br /&gt;
palindromi devono essere listati una sola volta).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg==&lt;br /&gt;
&amp;lt;source lang =&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import sys, os&lt;br /&gt;
&lt;br /&gt;
lines = []&lt;br /&gt;
directory = sys.argv[1]&lt;br /&gt;
&lt;br /&gt;
for file in os.listdir(directory):&lt;br /&gt;
    lines.append(file)&lt;br /&gt;
    &lt;br /&gt;
for el in lines:&lt;br /&gt;
    for le in lines:&lt;br /&gt;
        if el[::-1] == le:&lt;br /&gt;
            print el&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Dado==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
cd $1&lt;br /&gt;
files=`ls`&lt;br /&gt;
ls &amp;gt; /tmp/tmp.txt&lt;br /&gt;
rev /tmp/tmp.txt &amp;gt; /tmp/tmp2.txt&lt;br /&gt;
for file in $files; do&lt;br /&gt;
	grep $file /tmp/tmp2.txt&lt;br /&gt;
done&lt;br /&gt;
rm /tmp/tmp.txt&lt;br /&gt;
rm /tmp/tmp2.txt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_23-06-09&amp;diff=1079</id>
		<title>Esercizio 1 Prova Pratica 23-06-09</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_23-06-09&amp;diff=1079"/>
		<updated>2015-05-10T16:31:51Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;&amp;lt;source lang =&amp;quot;text&amp;quot;&amp;gt; Scrivere un programma in linguaggio C denominato “scriptexec” che venga richiamato con un solo parametro: il nome di un file che contiene un elenco d...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang =&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma in linguaggio C denominato “scriptexec” che venga&lt;br /&gt;
richiamato con un solo parametro: il nome di un file che contiene un elenco di comandi con i rispettivi parametri, uno per&lt;br /&gt;
riga.&lt;br /&gt;
Le righe che iniziano per '#' sono commenti.&lt;br /&gt;
Il programma esegue uno dopo l'altro i comandi presenti nel file.&lt;br /&gt;
(E' &lt;br /&gt;
vietato &lt;br /&gt;
 l'uso di chiamate quali system o popen).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Dado e Pierg==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;quot;s2argv/s2argv.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
    if(argc!=2){&lt;br /&gt;
        printf(&amp;quot;Wrong parameters number\n&amp;quot;);&lt;br /&gt;
    }else{&lt;br /&gt;
    	char *comm=NULL;&lt;br /&gt;
    	FILE *f;&lt;br /&gt;
    	ssize_t dim=0;&lt;br /&gt;
    	f=fopen(argv[1],&amp;quot;r&amp;quot;);&lt;br /&gt;
    	if(f==NULL){&lt;br /&gt;
    		printf(&amp;quot;Error while opening file %s\n&amp;quot;,argv[1]);&lt;br /&gt;
    		exit(1);&lt;br /&gt;
    	}&lt;br /&gt;
        while(getline(&amp;amp;comm,&amp;amp;dim,f)&amp;gt;0){&lt;br /&gt;
		system_noshell(comm);&lt;br /&gt;
		/*preparo comandi successivi*/&lt;br /&gt;
    	        free(comm);&lt;br /&gt;
    	        comm=NULL;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1076</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=1076"/>
		<updated>2015-05-10T16:27:23Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&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;
[[Linker fisico (Prova pratica 20-02-2014)]]&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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_2_esame_29/05/2014&amp;diff=1059</id>
		<title>Esercizio 2 esame 29/05/2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_2_esame_29/05/2014&amp;diff=1059"/>
		<updated>2015-04-22T18:40:46Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: /* Risoluzione Parte 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Parte 1:&lt;br /&gt;
Scrivere un programma con un solo parametro.&lt;br /&gt;
Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la directory esiste gia' o si&lt;br /&gt;
verifica un errore nella creazione, il programma deve terminare. Chiameremo questa directory “directory-base”&lt;br /&gt;
Il programma usando inotify rimane in attesa e stampa una riga di log per ogni file o directory creato o cancellato nella&lt;br /&gt;
directory-base. (solo nella directory-base, non nelle sottodirectory).&lt;br /&gt;
Quando viene cancellata la directory-base il programma termina.&lt;br /&gt;
&lt;br /&gt;
Parte 2:&lt;br /&gt;
Si estenda il programma dell'esercizio 1 per operare anche nelle sottodirectory. Quindi il programma “dovrebbe” stampare una&lt;br /&gt;
riga di log per ogni file o directory creata o cancellata in tutto il sottoalbero che ha nella directory-base la radice.&lt;br /&gt;
Nota: se necessario, usate strutture dati molto semplici come vettori o liste semplici, non preoccupatevi dell'efficienza.&lt;br /&gt;
In realta' per un problema nel design dell'API inotify, alcuni eventi di creazione di directory nidificate troppo vicini nel tempo&lt;br /&gt;
possono venir perduti.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Quadrelli==&lt;br /&gt;
===Risoluzione parte 1 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
void spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
void spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE) {&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s creato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s eliminata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s eliminato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella in listening %s eliminata\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Risoluzione Parte 2===&lt;br /&gt;
Ho risolto l'esercizio senza utilizzare vettori o liste, come consigliato nel testo, ma utilizzando la fork.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
int spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else return spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
int spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR){&lt;br /&gt;
          				int pid;&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          				pid=fork();&lt;br /&gt;
          				if(!pid){&lt;br /&gt;
          					char *newpath=malloc((strlen(path))+event-&amp;gt;len+1); /*sommo 1 alla fine per lo /*/&lt;br /&gt;
          					strcpy(newpath,path);&lt;br /&gt;
          					strcat(newpath,&amp;quot;/&amp;quot;);&lt;br /&gt;
          					strcat(newpath,event-&amp;gt;name);&lt;br /&gt;
          					return spy(newpath);&lt;br /&gt;
          				}&lt;br /&gt;
        			}&lt;br /&gt;
        			else&lt;br /&gt;
          				printf(&amp;quot;File %s creato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(!(event-&amp;gt;mask &amp;amp; IN_ISDIR))&lt;br /&gt;
          				printf(&amp;quot;File %s eliminato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella %s eliminata.\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sfrutto la struttura gerarchica del filesystem per non preoccuparmi di possibili processi zombie. Il padre controlla la radice e ritornerà solo quando la radice sarà eliminata. Per eliminarla, bisogna prima &amp;quot;svuotarla&amp;quot;, eliminando ogni file e directory al suo interno. Ciò mi assicura che ogni processo figlio (che sta controllando una sotto-cartella) terminerà prima del suo processo padre.&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_2_esame_29/05/2014&amp;diff=1058</id>
		<title>Esercizio 2 esame 29/05/2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_2_esame_29/05/2014&amp;diff=1058"/>
		<updated>2015-04-22T18:39:51Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Parte 1: Scrivere un programma con un solo parametro. Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Parte 1:&lt;br /&gt;
Scrivere un programma con un solo parametro.&lt;br /&gt;
Come prima cosa il programma deve creare una directory con il path specificato nel parametro. Se la directory esiste gia' o si&lt;br /&gt;
verifica un errore nella creazione, il programma deve terminare. Chiameremo questa directory “directory-base”&lt;br /&gt;
Il programma usando inotify rimane in attesa e stampa una riga di log per ogni file o directory creato o cancellato nella&lt;br /&gt;
directory-base. (solo nella directory-base, non nelle sottodirectory).&lt;br /&gt;
Quando viene cancellata la directory-base il programma termina.&lt;br /&gt;
&lt;br /&gt;
Parte 2:&lt;br /&gt;
Si estenda il programma dell'esercizio 1 per operare anche nelle sottodirectory. Quindi il programma “dovrebbe” stampare una&lt;br /&gt;
riga di log per ogni file o directory creata o cancellata in tutto il sottoalbero che ha nella directory-base la radice.&lt;br /&gt;
Nota: se necessario, usate strutture dati molto semplici come vettori o liste semplici, non preoccupatevi dell'efficienza.&lt;br /&gt;
In realta' per un problema nel design dell'API inotify, alcuni eventi di creazione di directory nidificate troppo vicini nel tempo&lt;br /&gt;
possono venir perduti.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Quadrelli==&lt;br /&gt;
===Risoluzione parte 1 ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
void spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
void spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE) {&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s creato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR)&lt;br /&gt;
          				printf( &amp;quot;Cartella %s eliminata\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
        			else&lt;br /&gt;
          				printf( &amp;quot;File %s eliminato\n&amp;quot;, event-&amp;gt;name );&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella in listening %s eliminata\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Risoluzione Parte 2===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/inotify.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define EVENT_SIZE (sizeof(struct inotify_event))&lt;br /&gt;
#define BUFFER_SIZE (100*(EVENT_SIZE+16))&lt;br /&gt;
&lt;br /&gt;
/*dichiarazione di spy*/&lt;br /&gt;
int spy(char *path);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char * argv[]){&lt;br /&gt;
	if(argc!=2){&lt;br /&gt;
	printf(&amp;quot;Numero argomenti sbagliato\n&amp;quot;);&lt;br /&gt;
	return -1;&lt;br /&gt;
	}else{&lt;br /&gt;
		int res=mkdir(argv[1],(mode_t)0777);&lt;br /&gt;
		if(res!=0)exit(-1);&lt;br /&gt;
		else return spy(argv[1]);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*metodo che utilizza la inotify*/&lt;br /&gt;
int spy(char *path){&lt;br /&gt;
	int again=1;&lt;br /&gt;
	int fd;&lt;br /&gt;
	char buffer[BUFFER_SIZE];&lt;br /&gt;
	/*inizializzo il File Descriptor dell inotify*/&lt;br /&gt;
	fd=inotify_init();&lt;br /&gt;
	/*aggiungo &amp;quot;handler&amp;quot; per creazioni, eliminazioni all'interno della cartella path e per la sua eliminazione*/&lt;br /&gt;
	inotify_add_watch(fd,path, IN_CREATE | IN_DELETE | IN_DELETE_SELF);&lt;br /&gt;
	/*ciclo del programma di attesa dei valori*/&lt;br /&gt;
	printf(&amp;quot;Entro in ascolto della cartella %s\n&amp;quot;,path);&lt;br /&gt;
	while(again){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		int len=read(fd,buffer,BUFFER_SIZE);&lt;br /&gt;
		while(i&amp;lt;len){&lt;br /&gt;
			/*gestisco un evento alla volta*/&lt;br /&gt;
			struct inotify_event *event =(struct inotify_event*)&amp;amp;buffer[i];&lt;br /&gt;
				/*controllo eventuale creazione di un file o di una cartella*/&lt;br /&gt;
      			if(event-&amp;gt;mask &amp;amp; IN_CREATE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(event-&amp;gt;mask &amp;amp; IN_ISDIR){&lt;br /&gt;
          				int pid;&lt;br /&gt;
          				printf( &amp;quot;Cartella %s creata in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          				pid=fork();&lt;br /&gt;
          				if(!pid){&lt;br /&gt;
          					char *newpath=malloc((strlen(path))+event-&amp;gt;len+1); /*sommo 1 alla fine per lo /*/&lt;br /&gt;
          					strcpy(newpath,path);&lt;br /&gt;
          					strcat(newpath,&amp;quot;/&amp;quot;);&lt;br /&gt;
          					strcat(newpath,event-&amp;gt;name);&lt;br /&gt;
          					return spy(newpath);&lt;br /&gt;
          				}&lt;br /&gt;
        			}&lt;br /&gt;
        			else&lt;br /&gt;
          				printf(&amp;quot;File %s creato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
      			}&lt;br /&gt;
      			/*controllo eventuale eliminazione di un file o di una cartella*/&lt;br /&gt;
      			else if(event-&amp;gt;mask &amp;amp; IN_DELETE){&lt;br /&gt;
      				/*distinguo i due casi distinti*/&lt;br /&gt;
        			if(!(event-&amp;gt;mask &amp;amp; IN_ISDIR))&lt;br /&gt;
          				printf(&amp;quot;File %s eliminato in %s\n&amp;quot;,event-&amp;gt;name,path);&lt;br /&gt;
          		}&lt;br /&gt;
          		/*controllo eventuale eliminazione della cartella che sto controllando*/&lt;br /&gt;
          		else if(event-&amp;gt;mask &amp;amp; IN_DELETE_SELF){&lt;br /&gt;
          			printf(&amp;quot;Cartella %s eliminata.\n&amp;quot;,path);&lt;br /&gt;
          			again=0;	/*fermo il ciclo più esterno che esegue le read*/&lt;br /&gt;
          		}&lt;br /&gt;
          	/*avanzo all'evento successivo, se c'è*/&lt;br /&gt;
    		i += EVENT_SIZE + event-&amp;gt;len;	&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Sfrutto la struttura gerarchica del filesystem per non preoccuparmi di possibili processi zombie. Il padre controlla la radice e ritornerà solo quando la radice sarà eliminata. Per eliminarla, bisogna prima &amp;quot;svuotarla&amp;quot;, eliminando ogni file e directory al suo interno. Ciò mi assicura che ogni processo figlio (che sta controllando una sotto-cartella) terminerà prima del suo processo padre.&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1057</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=1057"/>
		<updated>2015-04-22T18:31:40Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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;
[[Linker fisico (Prova pratica 20-02-2014)]]&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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1056</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=1056"/>
		<updated>2015-04-22T18:31:05Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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;
[[Linker fisico (Prova pratica 20-02-2014)]]&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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1055</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=1055"/>
		<updated>2015-04-22T18:29:58Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[Esercizio 1, prova pratica 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;
[[Linker fisico (Prova pratica 20-02-2014)]]&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 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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_12-09-11&amp;diff=1026</id>
		<title>Esercizio 1 Prova Pratica 12-09-11</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_12-09-11&amp;diff=1026"/>
		<updated>2015-04-14T11:06:47Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: /* Soluzione di Pierg e Quadrelli */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Siano date due directory del file system.&lt;br /&gt;
Il programma deve cercare i file .c e .h presenti nelle due directory evidenziando quali sono presenti in una sola&lt;br /&gt;
directory&lt;br /&gt;
Es:&lt;br /&gt;
$ cmpsource so.1.0 so.1.1&lt;br /&gt;
so.1.0/file.c not in so.1.1&lt;br /&gt;
so.1.1/head.h not in so.1.0&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg e Quadrelli==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*funzione per avere l'estensione del file*/&lt;br /&gt;
const char *get_filename_ext(const char *filename) {&lt;br /&gt;
    const char *dot = strrchr(filename, '.');&lt;br /&gt;
    if(!dot || dot == filename) return &amp;quot;&amp;quot;;&lt;br /&gt;
    return dot + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*funzione per comparare tutti i file tra una e l'altra directory*/&lt;br /&gt;
void cmp(char *path1,char *path2){&lt;br /&gt;
	DIR *dir1,*dir2;&lt;br /&gt;
	struct dirent *f1,*f2;&lt;br /&gt;
	int bol;&lt;br /&gt;
	if((dir1=opendir(path1))==NULL){&lt;br /&gt;
		perror(&amp;quot;ERRORE DIR1&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	while((f1=readdir(dir1))!=NULL){&lt;br /&gt;
		bol=0;&lt;br /&gt;
		if(strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;c&amp;quot;)==0 || strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;h&amp;quot;)==0){&lt;br /&gt;
			if((dir2=opendir(path2))==NULL){&lt;br /&gt;
				perror(&amp;quot;ERRORE DIR2&amp;quot;);&lt;br /&gt;
				exit(-1);&lt;br /&gt;
			}&lt;br /&gt;
			while((f2=readdir(dir2))!=NULL){&lt;br /&gt;
				if(strcmp(f1-&amp;gt;d_name,f2-&amp;gt;d_name)==0){&lt;br /&gt;
					bol=1;&lt;br /&gt;
					break;&lt;br /&gt;
				} &lt;br /&gt;
			}&lt;br /&gt;
			closedir(dir2);&lt;br /&gt;
			if(!bol){&lt;br /&gt;
				printf(&amp;quot;%s/%s not in %s\n&amp;quot;,path1,f1-&amp;gt;d_name,path2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	closedir(dir1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*main del programma*/&lt;br /&gt;
int main (int argc, char *argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		perror(&amp;quot;PARAMETRI ERRATI&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	cmp(argv[1],argv[2]);&lt;br /&gt;
	cmp(argv[2],argv[1]);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_12-09-11&amp;diff=1025</id>
		<title>Esercizio 1 Prova Pratica 12-09-11</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_Prova_Pratica_12-09-11&amp;diff=1025"/>
		<updated>2015-04-14T11:06:05Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Siano date due directory del file system. Il programma deve cercare i file .c e .h presenti nelle due directory evidenziando quali sono presenti in una so...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Siano date due directory del file system.&lt;br /&gt;
Il programma deve cercare i file .c e .h presenti nelle due directory evidenziando quali sono presenti in una sola&lt;br /&gt;
directory&lt;br /&gt;
Es:&lt;br /&gt;
$ cmpsource so.1.0 so.1.1&lt;br /&gt;
so.1.0/file.c not in so.1.1&lt;br /&gt;
so.1.1/head.h not in so.1.0&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di Pierg e Quadrelli==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*funzione per avere l'estensione del file*/&lt;br /&gt;
const char *get_filename_ext(const char *filename) {&lt;br /&gt;
    const char *dot = strrchr(filename, '.');&lt;br /&gt;
    if(!dot || dot == filename) return &amp;quot;&amp;quot;;&lt;br /&gt;
    return dot + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*funzione per comparare tutti i file tra una e l'altra directory*/&lt;br /&gt;
void cmp(char *path1,char *path2){&lt;br /&gt;
	DIR *dir1,*dir2;&lt;br /&gt;
	struct dirent *f1,*f2;&lt;br /&gt;
	int bol;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*funzione per avere l'estensione del file*/&lt;br /&gt;
const char *get_filename_ext(const char *filename) {&lt;br /&gt;
    const char *dot = strrchr(filename, '.');&lt;br /&gt;
    if(!dot || dot == filename) return &amp;quot;&amp;quot;;&lt;br /&gt;
    return dot + 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*funzione per comparare tutti i file tra una e l'altra directory*/&lt;br /&gt;
void cmp(char *path1,char *path2){&lt;br /&gt;
	DIR *dir1,*dir2;&lt;br /&gt;
	struct dirent *f1,*f2;&lt;br /&gt;
	int bol;&lt;br /&gt;
	if((dir1=opendir(path1))==NULL){&lt;br /&gt;
		perror(&amp;quot;ERRORE DIR1&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	while((f1=readdir(dir1))!=NULL){&lt;br /&gt;
		bol=0;&lt;br /&gt;
		if(strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;c&amp;quot;)==0 || strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;h&amp;quot;)==0){&lt;br /&gt;
			if((dir2=opendir(path2))==NULL){&lt;br /&gt;
				perror(&amp;quot;ERRORE DIR2&amp;quot;);&lt;br /&gt;
				exit(-1);&lt;br /&gt;
			}&lt;br /&gt;
			while((f2=readdir(dir2))!=NULL){&lt;br /&gt;
				if(strcmp(f1-&amp;gt;d_name,f2-&amp;gt;d_name)==0){&lt;br /&gt;
					bol=1;&lt;br /&gt;
					break;&lt;br /&gt;
				} &lt;br /&gt;
			}&lt;br /&gt;
			closedir(dir2);&lt;br /&gt;
			if(!bol){&lt;br /&gt;
				printf(&amp;quot;%s/%s not in %s\n&amp;quot;,path1,f1-&amp;gt;d_name,path2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	closedir(dir1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*main del programma*/&lt;br /&gt;
int main (int argc, char *argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		perror(&amp;quot;PARAMETRI ERRATI&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	cmp(argv[1],argv[2]);&lt;br /&gt;
	cmp(argv[2],argv[1]);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
	if((dir1=opendir(path1))==NULL){&lt;br /&gt;
		perror(&amp;quot;ERRORE DIR1&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	while((f1=readdir(dir1))!=NULL){&lt;br /&gt;
		bol=0;&lt;br /&gt;
		if(strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;c&amp;quot;)==0 || strcmp(get_filename_ext(f1-&amp;gt;d_name),&amp;quot;h&amp;quot;)==0){&lt;br /&gt;
			if((dir2=opendir(path2))==NULL){&lt;br /&gt;
				perror(&amp;quot;ERRORE DIR2&amp;quot;);&lt;br /&gt;
				exit(-1);&lt;br /&gt;
			}&lt;br /&gt;
			while((f2=readdir(dir2))!=NULL){&lt;br /&gt;
				if(strcmp(f1-&amp;gt;d_name,f2-&amp;gt;d_name)==0){&lt;br /&gt;
					bol=1;&lt;br /&gt;
					break;&lt;br /&gt;
				} &lt;br /&gt;
			}&lt;br /&gt;
			closedir(dir2);&lt;br /&gt;
			if(!bol){&lt;br /&gt;
				printf(&amp;quot;%s/%s not in %s\n&amp;quot;,path1,f1-&amp;gt;d_name,path2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	closedir(dir1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*main del programma*/&lt;br /&gt;
int main (int argc, char *argv[]){&lt;br /&gt;
	if(argc!=3){&lt;br /&gt;
		perror(&amp;quot;PARAMETRI ERRATI&amp;quot;);&lt;br /&gt;
		exit(-1);&lt;br /&gt;
	}&lt;br /&gt;
	cmp(argv[1],argv[2]);&lt;br /&gt;
	cmp(argv[2],argv[1]);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1024</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=1024"/>
		<updated>2015-04-14T11:02:37Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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;
[[Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)]]&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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3,_prova_pratica_13/09/2013&amp;diff=960</id>
		<title>Esercizio 3, prova pratica 13/09/2013</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3,_prova_pratica_13/09/2013&amp;diff=960"/>
		<updated>2015-04-04T09:24:39Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Consegna([http://www.cs.unibo.it/~renzo/so/pratiche/2013.09.13.pdf]):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Sia data una directory che contiene file di testo.&lt;br /&gt;
Scopo dell'esercizio e' di contare i caratteri delle corrispondenti righe di testo di tutti i file della directory, si vuole cioe' sapere&lt;br /&gt;
il numero totale di caratteri presenti nelle prime righe di tutti i file, nelle seconde linee, ecc.&lt;br /&gt;
$ ccpl mydir&lt;br /&gt;
1 234&lt;br /&gt;
2 21&lt;br /&gt;
3 333&lt;br /&gt;
.....&lt;br /&gt;
l'ouput significa che se contiamo tutti i caratteri contenuti nella prima riga di tutti i file in mydir otteniamo 234 (mydir/file1&lt;br /&gt;
puo' avere 40 caratteri nella prima riga, mydir/file2 ne puo' avere 20, ecc... procedendo per tutti i file di mydir la somma fa&lt;br /&gt;
234).&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Maldus===&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;
count=1		#conta il numero di riga che sto considerando&lt;br /&gt;
bool=1		#resta 1 finchè ci sono righe da contare in qualche file&lt;br /&gt;
file=`ls`&lt;br /&gt;
&lt;br /&gt;
while [[ $bool -eq 1 ]]; do&lt;br /&gt;
	tot=0&lt;br /&gt;
	bool=0&lt;br /&gt;
	for word in $file; do&lt;br /&gt;
		if [[ (-r $word) &amp;amp;&amp;amp; (-s $word) &amp;amp;&amp;amp; (! $word = *~ ) ]]; then&lt;br /&gt;
			x=`awk 'NR==c' c=$count $word | wc -m`	#considero solo la riga contata da count&lt;br /&gt;
			if [[ $x -ne 0 ]]; then			#se la riga non è vuota&lt;br /&gt;
				tot=`expr $tot + $x - 1`	#con -1 tolgo il carattere \n che era stato contato da awk&lt;br /&gt;
				bool=1				#bool=1 finchè c'è qualche riga da contare&lt;br /&gt;
			fi&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
	if [[ $bool -eq 1 ]]; then &lt;br /&gt;
		echo &amp;quot;$count: $tot&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
	count=`expr $count + 1`&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Davide Quadrelli===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [[ -n $1 ]]; then&lt;br /&gt;
	cd $1&lt;br /&gt;
	files=`ls -p | grep -v /`	#elenco file&lt;br /&gt;
else&lt;br /&gt;
	echo&amp;quot;Inserire cartella come parametro&amp;quot;&lt;br /&gt;
	exit&lt;br /&gt;
fi&lt;br /&gt;
array=()&lt;br /&gt;
#per ogni file nella cartella&lt;br /&gt;
for file in $files; do&lt;br /&gt;
	i=0&lt;br /&gt;
	while read line; do&lt;br /&gt;
		#conto la lunghezza di ogni riga e la aggiungo nella corrispondente cella dell'array&lt;br /&gt;
		len=`expr length &amp;quot;${line}&amp;quot;`&lt;br /&gt;
		array[$i]=`expr ${array[$i]} + $len`&lt;br /&gt;
		((i++))&lt;br /&gt;
	done &amp;lt; $file&lt;br /&gt;
done&lt;br /&gt;
#a questo punto l'i-esima cella contiene la somma delle lunghezze della i-esima riga di ogni file&lt;br /&gt;
i=1&lt;br /&gt;
for n in ${array[@]}; do&lt;br /&gt;
	echo &amp;quot;$i $n&amp;quot;&lt;br /&gt;
	((i++))&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.06.17&amp;diff=958</id>
		<title>Prova Pratica 2014.06.17</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.06.17&amp;diff=958"/>
		<updated>2015-04-03T10:15:12Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: /* Soluzione di Davide Quadrelli */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Testo==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Il comando che dovrete implementare come script shell o programma python e' maxfreq.&lt;br /&gt;
Maxfreq ha come parametro un carattere alfanumerico e una directory.&lt;br /&gt;
Es:&lt;br /&gt;
maxfreq q mydir&lt;br /&gt;
Cerca in tutto il sottoalbero del file system originato da mydir il file che ha la maggior frequenza della lettera indicata (in&lt;br /&gt;
questo caso la maggior frequenza di 'q'). Fornisce in output il nome del file e la frequenza in percentuale.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Davide Quadrelli===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
if [[ -z $1 ]] ; then&lt;br /&gt;
	echo &amp;quot;maxfreq [char da contare] [directory]&amp;quot;&lt;br /&gt;
	exit&lt;br /&gt;
fi&lt;br /&gt;
if [[ -n $2 ]] ; then&lt;br /&gt;
	files=`find -L $2`&lt;br /&gt;
else&lt;br /&gt;
	echo if2&lt;br /&gt;
	echo &amp;quot;maxfreq [char da contare] [directory]&amp;quot;&lt;br /&gt;
	exit&lt;br /&gt;
fi&lt;br /&gt;
max=0&lt;br /&gt;
file=&amp;quot;&amp;quot;&lt;br /&gt;
for var in $files; do&lt;br /&gt;
	tmp=`cat $var 2&amp;gt; /dev/null | grep -c $1 2&amp;gt; /dev/null`&lt;br /&gt;
	if [[ max -le tmp ]]; then&lt;br /&gt;
		max=$tmp&lt;br /&gt;
		file=$var&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
dim=`ls -l $file | cut -d &amp;quot; &amp;quot; -f 5`&lt;br /&gt;
echo &amp;quot;( ${max} * 100 ) / ${dim}&amp;quot; &amp;gt; tmp&lt;br /&gt;
echo &amp;quot;quit&amp;quot; &amp;gt;&amp;gt; tmp&lt;br /&gt;
perc=`bc -q tmp`&lt;br /&gt;
rm tmp&lt;br /&gt;
echo &amp;quot;Il file $file contiene ${perc}% di $1 ($max su $dim caratteri)&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ho sfruttato il comando bc per calcolare la percentuale. Utilizzo il parametro -q per impedire che stampi il &amp;quot;saluto&amp;quot; del programma e metto tutto il codice da eseguire nel file tmp. Oltre al comando, inserisco un &amp;quot;quit&amp;quot; per terminare il comando bc, che avrà restituito alla variabile soltanto il risultato del calcolo. Elimino poi ovviamente il file tmp.&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.06.17&amp;diff=957</id>
		<title>Prova Pratica 2014.06.17</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Pratica_2014.06.17&amp;diff=957"/>
		<updated>2015-04-03T10:12:33Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;==Testo== &amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Il comando che dovrete implementare come script shell o programma python e' maxfreq. Maxfreq ha come parametro un carattere alfanumerico e una d...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Testo==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Il comando che dovrete implementare come script shell o programma python e' maxfreq.&lt;br /&gt;
Maxfreq ha come parametro un carattere alfanumerico e una directory.&lt;br /&gt;
Es:&lt;br /&gt;
maxfreq q mydir&lt;br /&gt;
Cerca in tutto il sottoalbero del file system originato da mydir il file che ha la maggior frequenza della lettera indicata (in&lt;br /&gt;
questo caso la maggior frequenza di 'q'). Fornisce in output il nome del file e la frequenza in percentuale.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Davide Quadrelli===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
if [[ -z $1 ]] ; then&lt;br /&gt;
	echo &amp;quot;maxfreq [char da contare] [directory]&amp;quot;&lt;br /&gt;
	exit&lt;br /&gt;
fi&lt;br /&gt;
if [[ -n $2 ]] ; then&lt;br /&gt;
	files=`find -L $2`&lt;br /&gt;
else&lt;br /&gt;
	echo if2&lt;br /&gt;
	echo &amp;quot;maxfreq [char da contare] [directory]&amp;quot;&lt;br /&gt;
	exit&lt;br /&gt;
fi&lt;br /&gt;
max=0&lt;br /&gt;
file=&amp;quot;&amp;quot;&lt;br /&gt;
for var in $files; do&lt;br /&gt;
	tmp=`cat $var 2&amp;gt; /dev/null | grep -c $1 2&amp;gt; /dev/null`&lt;br /&gt;
	if [[ max -le tmp ]]; then&lt;br /&gt;
		max=$tmp&lt;br /&gt;
		file=$var&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
dim=`ls -l $file | cut -d &amp;quot; &amp;quot; -f 5`&lt;br /&gt;
echo &amp;quot;( ${max} * 100 ) / ${dim}&amp;quot; &amp;gt; tmp&lt;br /&gt;
echo &amp;quot;quit&amp;quot; &amp;gt;&amp;gt; tmp&lt;br /&gt;
perc=`bc -q tmp`&lt;br /&gt;
rm tmp&lt;br /&gt;
echo &amp;quot;Il file $file contiene ${perc}% di $1 ($max su $dim caratteri)&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=956</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=956"/>
		<updated>2015-04-03T10:09:22Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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;
[[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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=953</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=953"/>
		<updated>2015-04-02T15:44:05Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: &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 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>Davide.quadrelli2</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_17_07_14&amp;diff=952</id>
		<title>Prova pratica 17 07 14</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_pratica_17_07_14&amp;diff=952"/>
		<updated>2015-04-02T15:43:38Z</updated>

		<summary type="html">&lt;p&gt;Davide.quadrelli2: Created page with &amp;quot;==Esercizio 1 == &amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Scrivere un programma che per ogni file .c nella directory corrente chiami il compilatore gcc per generare il file oggetto (.o) a meno ch...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Esercizio 1 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Scrivere un programma che per ogni file .c nella directory corrente chiami il compilatore gcc per generare il file oggetto (.o) a&lt;br /&gt;
meno che esista gia' nella directory un file oggetto relativo allo stesso sorgente che sia piu' nuovo (ultima modifica) del&lt;br /&gt;
sorgente.&lt;br /&gt;
Tutti I parametri devono essere passati al compilatore.&lt;br /&gt;
Es:&lt;br /&gt;
genobj -I . -ggdb&lt;br /&gt;
se nella directory corrente esistono I file uno.c e due.c e il file due.o deve richiamare&lt;br /&gt;
gcc -I. -ggdb -c uno.c&lt;br /&gt;
e, solo se due.o ha ultima modifica precedente a due.c, deve chiamare&lt;br /&gt;
gcc -I. -ggdb -c due.c&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Davide Quadrelli===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX 256&lt;br /&gt;
#define DIM_MAX 1000&lt;br /&gt;
#define dim_last_data 4&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char *argv[]){&lt;br /&gt;
	int i,len,com_size,bol=0;	&lt;br /&gt;
	struct stat o_data,f_data;&lt;br /&gt;
	struct dirent *cur_file;&lt;br /&gt;
	char name[MAX];&lt;br /&gt;
	char prefix[DIM_MAX]=&amp;quot;gcc &amp;quot;;&lt;br /&gt;
	char *comm;&lt;br /&gt;
	FILE *o;&lt;br /&gt;
	FILE *obj=NULL;&lt;br /&gt;
	DIR *dir=opendir(&amp;quot;./&amp;quot;);&lt;br /&gt;
	/*store in prefix the common part of every command to launch*/&lt;br /&gt;
    for (i=1;i&amp;lt;argc;i++){&lt;br /&gt;
        strcat(prefix,argv[i]);&lt;br /&gt;
        strcat(prefix,&amp;quot; &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    com_size=strlen(prefix);&lt;br /&gt;
    /*search in the current directory C files*/&lt;br /&gt;
    while(cur_file=readdir(dir)){&lt;br /&gt;
        if(cur_file-&amp;gt;d_type==DT_REG){&lt;br /&gt;
            /*it's a file*/&lt;br /&gt;
            bol=0;&lt;br /&gt;
            strcpy(name,cur_file-&amp;gt;d_name);&lt;br /&gt;
            printf(&amp;quot;file found: %s &amp;quot;,name);&lt;br /&gt;
            len=strlen(name);&lt;br /&gt;
            if(strcmp(&amp;amp;(name[len-2]),&amp;quot;.c&amp;quot;)==0){&lt;br /&gt;
                /*C file found*/&lt;br /&gt;
                printf(&amp;quot;... source code found ...&amp;quot;);&lt;br /&gt;
                /*check if the file has already an uptaded object file*/&lt;br /&gt;
                name[len-1]='o';&lt;br /&gt;
                if ((o=fopen(name,&amp;quot;r&amp;quot;))==NULL){&lt;br /&gt;
                    /*the corrispondent object file doesn't exists*/&lt;br /&gt;
                    bol=1;&lt;br /&gt;
                    name[len-1]='c';&lt;br /&gt;
                }else{&lt;br /&gt;
                    fclose(o);&lt;br /&gt;
                    /*get the stat data of the object file*/&lt;br /&gt;
                    if(stat(name,&amp;amp;o_data)){&lt;br /&gt;
                        write(STDERR_FILENO,&amp;quot;ERRORE STAT&amp;quot;,11);&lt;br /&gt;
                        exit(-1);&lt;br /&gt;
                    }&lt;br /&gt;
                    /*get the stat data of the C file*/&lt;br /&gt;
                    name[len-1]='c';&lt;br /&gt;
                    if(stat(name,&amp;amp;f_data)){&lt;br /&gt;
                        write(STDERR_FILENO,&amp;quot;ERRORE STAT&amp;quot;,11);&lt;br /&gt;
                        exit(-1);&lt;br /&gt;
                    }&lt;br /&gt;
                    /*check if the object file must be re-created*/&lt;br /&gt;
                    if(o_data.st_mtime&amp;lt;f_data.st_mtime){&lt;br /&gt;
                        bol=1;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if(bol){&lt;br /&gt;
                /*prepare and exec the command*/&lt;br /&gt;
                comm=(char *)malloc(com_size+len+dim_last_data);&lt;br /&gt;
                strcpy(comm,prefix);&lt;br /&gt;
                strcat(comm,&amp;quot;-c &amp;quot;);&lt;br /&gt;
                strcat(comm,name);&lt;br /&gt;
                system(comm);&lt;br /&gt;
                printf(&amp;quot;object file created.\n%s&amp;quot;,comm);&lt;br /&gt;
            }&lt;br /&gt;
            printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Il comando che dovrete implementare come script shell o programma python e' mytx.&lt;br /&gt;
Tale comando elenca tutti i file di una directory.&lt;br /&gt;
mytx ddd ddd.tx&lt;br /&gt;
Ogni riga del file di output (secondo parametro) deve contenere la lunghezza, uno spazio e il nume del file. Dopo l'ultima riga&lt;br /&gt;
deve inserire una riga bianca.&lt;br /&gt;
ddd.t2 deve contenere l'elenco dei file regolari. Il primo campo e' un numero intero seguito da uno spazio, tutto cio' che segue&lt;br /&gt;
fino alla fine riga e' il nome del file.&lt;br /&gt;
es.&lt;br /&gt;
12 file1&lt;br /&gt;
235 file di prova&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soluzione di Davide Quadrelli===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
#Interpreto la richiesta del testo come segue:&lt;br /&gt;
#implementare mytx ddd ddd.tx ove ddd è una directory, ddd.tx è un file&lt;br /&gt;
#mytx deve elencare i file della directory ddd scrivere nel file ddd.tx di output una riga per file contenente&lt;br /&gt;
#la lunghezza del file, uno spazio e il nome del file. ddd.tx deve terminare con una riga bianca.&lt;br /&gt;
&lt;br /&gt;
if [[ -d $1 ]] ; then&lt;br /&gt;
	ls $1&lt;br /&gt;
	old=`pwd`&lt;br /&gt;
	cd $1&lt;br /&gt;
	files=`ls`&lt;br /&gt;
	for var in $files ; do&lt;br /&gt;
		if [[ -f $var ]]; then&lt;br /&gt;
			wc -c ${var} 1&amp;gt;&amp;gt; ${old}/${2}&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
	echo &amp;gt;&amp;gt; ${old}/${2}&lt;br /&gt;
&lt;br /&gt;
else&lt;br /&gt;
	echo &amp;quot;inserire come primo parametro la directory e come secondo il file da scrivere&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davide.quadrelli2</name></author>
	</entry>
</feed>