<?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=Blissett</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=Blissett"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Blissett"/>
	<updated>2026-05-04T13:49:08Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3_Prova_Pratica_25-09-2014&amp;diff=1083</id>
		<title>Esercizio 3 Prova Pratica 25-09-2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_3_Prova_Pratica_25-09-2014&amp;diff=1083"/>
		<updated>2015-05-11T11:14:53Z</updated>

		<summary type="html">&lt;p&gt;Blissett: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Scrivere un programma python o uno scrip bash che faccia un backup storico di un file. backn file n deve mantenere n versioni del file specificato. n&amp;gt;2 Es...&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 python o uno scrip bash che faccia un backup storico di un file.&lt;br /&gt;
backn file n&lt;br /&gt;
deve mantenere n versioni del file specificato. n&amp;gt;2&lt;br /&gt;
Esempio:&lt;br /&gt;
backn miofile 10&lt;br /&gt;
se esiste miofile.9 deve essere rinominato in miofile.10&lt;br /&gt;
se esiste miofile 8 deve essere rinominato in miofile 9&lt;br /&gt;
e cosi' via fino a miofile.2, rinominato miofile 3.&lt;br /&gt;
ora se miofile.1 ha lo stesso contenuto di miofile.3, miofile diventa un link fisico a miofile.2&lt;br /&gt;
miofile viene copiato in miofile.1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Blissett ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $# != 2 || ! -f $1 ]]&lt;br /&gt;
then &lt;br /&gt;
		echo &amp;quot;Usage: $0 file n_backup&amp;quot;&lt;br /&gt;
		exit -48&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
file=$1&lt;br /&gt;
n_backup=$2&lt;br /&gt;
cartella=&amp;quot;cartellaBackup&amp;quot;&lt;br /&gt;
true=0 &lt;br /&gt;
&lt;br /&gt;
if [[ ! -d $cartella ]]&lt;br /&gt;
then&lt;br /&gt;
	mkdir $cartella&lt;br /&gt;
fi&lt;br /&gt;
cd ./$cartella&lt;br /&gt;
&lt;br /&gt;
for i in `find ./ -name &amp;quot;$file*&amp;quot; | sort -n -r -t. -k3 | cut -d. -f3` &lt;br /&gt;
do&lt;br /&gt;
	true=1&lt;br /&gt;
	tmp=`find ./ -name &amp;quot;$file.$i&amp;quot;`&lt;br /&gt;
	num=$(($i+1))&lt;br /&gt;
	mv $tmp &amp;quot;$file.$num&amp;quot;&lt;br /&gt;
	if [[ $num -gt n_backup ]]&lt;br /&gt;
	then&lt;br /&gt;
		rm &amp;quot;$file.$num&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
if [[ $true -eq 1 ]]&lt;br /&gt;
then&lt;br /&gt;
	cmp -s &amp;quot;$file.2&amp;quot; &amp;quot;../$file&amp;quot;&lt;br /&gt;
	if [[ $? -eq 0 ]]&lt;br /&gt;
	then	&lt;br /&gt;
	echo creo link fisico.&lt;br /&gt;
		ln &amp;quot;$file.2&amp;quot; &amp;quot;$file.1&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		cp ../$file ./&lt;br /&gt;
		mv $file &amp;quot;$file.1&amp;quot;&lt;br /&gt;
	fi&lt;br /&gt;
else&lt;br /&gt;
		cp ../$file ./&lt;br /&gt;
		mv $file &amp;quot;$file.1&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 13:14, 11 May 2015 (CEST)&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1082</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=1082"/>
		<updated>2015-05-11T11:13:56Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &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 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;
[[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>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1081</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=1081"/>
		<updated>2015-05-11T10:50:39Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &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 29-05-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;
[[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>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ricerca_e_stampa_MD5checksum_(Prova_pratica_21-01-2015)&amp;diff=1051</id>
		<title>Ricerca e stampa MD5checksum (Prova pratica 21-01-2015)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ricerca_e_stampa_MD5checksum_(Prova_pratica_21-01-2015)&amp;diff=1051"/>
		<updated>2015-04-21T10:11:27Z</updated>

		<summary type="html">&lt;p&gt;Blissett: /* Soluzione Blissett */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere un programma python o uno script bash che scandisca il sottoalbero relativo alle directory passate come parametri (o alla direcotry corrente se non ci sono parametri) e fornisca in output l'elenco dei file che hanno la stessa somma MD5 (i.e. l'output del comando md5sum).&lt;br /&gt;
In output ogni riga deve mostrare un elenco di pathname realtivi a file che hanno la stessa somma MD5 (che quindi sono molto molto probabilmente uguali)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Stefano Zaniboni ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
import hashlib&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def md5checksum(filepath):&lt;br /&gt;
    with open(filepath, &amp;quot;rb&amp;quot;) as afile:&lt;br /&gt;
        m = hashlib.md5()&lt;br /&gt;
        data = afile.read()&lt;br /&gt;
        m.update(data)&lt;br /&gt;
    return m.hexdigest()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_checksums(search_dir):&lt;br /&gt;
    checksums = defaultdict(list)&lt;br /&gt;
&lt;br /&gt;
    for root, dirs, files in os.walk(search_dir):&lt;br /&gt;
        for filename in files:&lt;br /&gt;
            path = os.path.join(root, filename)&lt;br /&gt;
            checksum = md5checksum(path)&lt;br /&gt;
            checksums[checksum].append(path)&lt;br /&gt;
    return checksums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def display_equal_files(checksums):&lt;br /&gt;
    for checksum, paths in checksums.items():&lt;br /&gt;
        if len(paths) &amp;gt; 1:&lt;br /&gt;
            print(&amp;quot;MD5 sum: {}&amp;quot;.format(checksum))&lt;br /&gt;
            for path in paths:&lt;br /&gt;
                print(&amp;quot;    {}&amp;quot;.format(path))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    search_dir = sys.argv[1]&lt;br /&gt;
    checksums = calculate_checksums(search_dir)&lt;br /&gt;
    display_equal_files(checksums)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ringrazio per l'aiuto nella ricerca dei file con stesso MD5 la comunità di stackoverflow&lt;br /&gt;
&lt;br /&gt;
== Soluzione Blissett ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $#=1 ]]&lt;br /&gt;
then &lt;br /&gt;
	if [[ -d $1 ]]&lt;br /&gt;
	then&lt;br /&gt;
	 	cd $1&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Usage: `basename $0` directory&amp;quot;&lt;br /&gt;
		exit $?&lt;br /&gt;
	fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
tmp=&amp;quot;&amp;quot;&lt;br /&gt;
indice=0&lt;br /&gt;
find=0&lt;br /&gt;
declare -a array&lt;br /&gt;
declare -a m5s&lt;br /&gt;
&lt;br /&gt;
for file in `find ./ -type f`&lt;br /&gt;
do	&lt;br /&gt;
	tmp=`md5sum $file | awk '{print $1}'`&lt;br /&gt;
	for i in ${!m5s[@]}&lt;br /&gt;
	do	&lt;br /&gt;
		if [[ &amp;quot;${m5s[$i]}&amp;quot; = &amp;quot;$tmp&amp;quot; ]]&lt;br /&gt;
		then&lt;br /&gt;
			array[$i]=&amp;quot;${array[$i]}`basename $file`; &amp;quot;&lt;br /&gt;
			find=1&lt;br /&gt;
			break&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	if [[ $find = 0 ]]&lt;br /&gt;
	then &lt;br /&gt;
		m5s[$indice]=$tmp&lt;br /&gt;
		array[$indice]=&amp;quot;`basename $file`; &amp;quot;&lt;br /&gt;
		indice=$(($indice + 1))&lt;br /&gt;
	fi&lt;br /&gt;
	find=0&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for i in ${!array[@]}&lt;br /&gt;
do&lt;br /&gt;
	echo &amp;quot;${array[$i]}&amp;quot;&lt;br /&gt;
done&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ricerca_e_stampa_MD5checksum_(Prova_pratica_21-01-2015)&amp;diff=1050</id>
		<title>Ricerca e stampa MD5checksum (Prova pratica 21-01-2015)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ricerca_e_stampa_MD5checksum_(Prova_pratica_21-01-2015)&amp;diff=1050"/>
		<updated>2015-04-21T10:05:26Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Scrivere un programma python o uno script bash che scandisca il sottoalbero relativo alle directory passate come parametri (o alla direcotry corrente se non ci sono parametri) e fornisca in output l'elenco dei file che hanno la stessa somma MD5 (i.e. l'output del comando md5sum).&lt;br /&gt;
In output ogni riga deve mostrare un elenco di pathname realtivi a file che hanno la stessa somma MD5 (che quindi sono molto molto probabilmente uguali)&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Stefano Zaniboni ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
import hashlib&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def md5checksum(filepath):&lt;br /&gt;
    with open(filepath, &amp;quot;rb&amp;quot;) as afile:&lt;br /&gt;
        m = hashlib.md5()&lt;br /&gt;
        data = afile.read()&lt;br /&gt;
        m.update(data)&lt;br /&gt;
    return m.hexdigest()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def calculate_checksums(search_dir):&lt;br /&gt;
    checksums = defaultdict(list)&lt;br /&gt;
&lt;br /&gt;
    for root, dirs, files in os.walk(search_dir):&lt;br /&gt;
        for filename in files:&lt;br /&gt;
            path = os.path.join(root, filename)&lt;br /&gt;
            checksum = md5checksum(path)&lt;br /&gt;
            checksums[checksum].append(path)&lt;br /&gt;
    return checksums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def display_equal_files(checksums):&lt;br /&gt;
    for checksum, paths in checksums.items():&lt;br /&gt;
        if len(paths) &amp;gt; 1:&lt;br /&gt;
            print(&amp;quot;MD5 sum: {}&amp;quot;.format(checksum))&lt;br /&gt;
            for path in paths:&lt;br /&gt;
                print(&amp;quot;    {}&amp;quot;.format(path))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    search_dir = sys.argv[1]&lt;br /&gt;
    checksums = calculate_checksums(search_dir)&lt;br /&gt;
    display_equal_files(checksums)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Ringrazio per l'aiuto nella ricerca dei file con stesso MD5 la comunità di stackoverflow&lt;br /&gt;
&lt;br /&gt;
== Soluzione Blissett ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $#=1 ]]&lt;br /&gt;
then &lt;br /&gt;
	if [[ -d $1 ]]&lt;br /&gt;
	then&lt;br /&gt;
	 	cd $1&lt;br /&gt;
	else&lt;br /&gt;
		echo &amp;quot;Usage: `basename $0` directory&amp;quot;&lt;br /&gt;
		exit $?&lt;br /&gt;
	fi&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
tmp=&amp;quot;&amp;quot;&lt;br /&gt;
indice=0&lt;br /&gt;
find=0&lt;br /&gt;
declare -a array&lt;br /&gt;
declare -a m5s&lt;br /&gt;
&lt;br /&gt;
for file in `find ./ -type f`&lt;br /&gt;
do	&lt;br /&gt;
	tmp=`md5sum $file | awk '{print $1}'`&lt;br /&gt;
	for i in ${!m5s[@]}&lt;br /&gt;
	do	&lt;br /&gt;
		if [[ &amp;quot;${m5s[$i]}&amp;quot; = &amp;quot;$tmp&amp;quot; ]]&lt;br /&gt;
		then&lt;br /&gt;
			array[$i]=&amp;quot;${array[$i]}`basename $file`; &amp;quot;&lt;br /&gt;
			find=1&lt;br /&gt;
			break&lt;br /&gt;
		fi&lt;br /&gt;
	done&lt;br /&gt;
&lt;br /&gt;
	if [[ $find = 0 ]]&lt;br /&gt;
	then &lt;br /&gt;
		m5s[$indice]=$tmp&lt;br /&gt;
		array[$indice]=&amp;quot;`basename $file`; &amp;quot;&lt;br /&gt;
		indice=$(($indice + 1))&lt;br /&gt;
	fi&lt;br /&gt;
	find=0&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
for i in ${!array[@]}&lt;br /&gt;
do&lt;br /&gt;
	echo &amp;quot;${array[$i]}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
--~~~~&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_20.06.2013&amp;diff=910</id>
		<title>Esercizio 1, prova pratica 20.06.2013</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_20.06.2013&amp;diff=910"/>
		<updated>2015-03-18T08:36:13Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &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 che stampi il numero di inode di ogni file presente in una direcotory passata come argomento (o della&lt;br /&gt;
direcotry corrente se il programma viene chiamato senza parametri) e stampi l'elenco in ordine crescente di numero di i-node.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Soluzione di D.Boldrin==&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;unistd.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;dirent.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef struct listnode {  //struttura dati per contenere tutti gli inode dei file di una directory&lt;br /&gt;
struct listnode *next;&lt;br /&gt;
int inode;&lt;br /&gt;
}listnode;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[]){&lt;br /&gt;
struct stat fileStat;&lt;br /&gt;
int contanode=0;&lt;br /&gt;
char *filename=argv[1];&lt;br /&gt;
struct stat tp;&lt;br /&gt;
DIR *path;&lt;br /&gt;
struct dirent *dir_object;&lt;br /&gt;
path = opendir(argv[1]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
listnode *root;&lt;br /&gt;
root = (listnode*)calloc(1, sizeof(listnode));&lt;br /&gt;
listnode *tmp=root;&lt;br /&gt;
dir_object = readdir(path); //comincia la scansione della cartella&lt;br /&gt;
	while(dir_object != NULL){&lt;br /&gt;
&lt;br /&gt;
		stat(dir_object-&amp;gt;d_name, &amp;amp;tp);&lt;br /&gt;
			if (S_ISREG(tp.st_mode)){	//l'oggetto dir_object é un file,quindi lo salvo nella struttura&lt;br /&gt;
				contanode++;&lt;br /&gt;
				stat(dir_object-&amp;gt;d_name, &amp;amp;fileStat);&lt;br /&gt;
				tmp-&amp;gt;inode=(fileStat.st_ino);&lt;br /&gt;
				tmp-&amp;gt;next=(listnode*)calloc(1, sizeof(listnode));&lt;br /&gt;
				tmp=tmp-&amp;gt;next;&lt;br /&gt;
			}&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
		dir_object = readdir(path);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
printf(&amp;quot;%d\n&amp;quot;, contanode);&lt;br /&gt;
ordinaLista(root);&lt;br /&gt;
stampaLista(root);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void ordinaLista(listnode *pnt){&lt;br /&gt;
&lt;br /&gt;
listnode *tmp=pnt;&lt;br /&gt;
int temp;&lt;br /&gt;
	while(tmp-&amp;gt;next!=NULL){&lt;br /&gt;
		&lt;br /&gt;
		while(pnt-&amp;gt;next!=NULL){&lt;br /&gt;
		if(pnt-&amp;gt;inode&amp;lt;tmp-&amp;gt;inode){&lt;br /&gt;
			temp=pnt-&amp;gt;inode;&lt;br /&gt;
			pnt-&amp;gt;inode=tmp-&amp;gt;inode;&lt;br /&gt;
			tmp-&amp;gt;inode=temp;&lt;br /&gt;
			}&lt;br /&gt;
		else{&lt;br /&gt;
		pnt=pnt-&amp;gt;next;&lt;br /&gt;
		}&lt;br /&gt;
		}&lt;br /&gt;
	tmp=tmp-&amp;gt;next;&lt;br /&gt;
	pnt=tmp;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void stampaLista(listnode *pnt){&lt;br /&gt;
&lt;br /&gt;
	while(pnt-&amp;gt;next!=NULL){&lt;br /&gt;
		printf(&amp;quot;%d\n&amp;quot;,pnt-&amp;gt;inode);&lt;br /&gt;
		pnt=pnt-&amp;gt;next;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problema: Se come parametro gli passo l'indirizzo di una directory diverso da quella in cui si trova il file.c, non funziona, o meglio esegue, termina ma non trova alcun file all'interno della directory (anche se sono sicuro che i file ci sono).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soluzione di blissett ==&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;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;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define MAX 1000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* struttura che salvera nome e i_node di ogni file presente nella directory */&lt;br /&gt;
typedef struct i_node {&lt;br /&gt;
		int num;&lt;br /&gt;
		char *nome;&lt;br /&gt;
}i_node;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static int confronto (i_node* elem1, i_node* elem2)&lt;br /&gt;
	{&lt;br /&gt;
		return (elem1-&amp;gt;num - elem2-&amp;gt;num);	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
int main (int argc, char *argv[]) &lt;br /&gt;
	{&lt;br /&gt;
		int x=0;&lt;br /&gt;
		int y=0;	&lt;br /&gt;
		DIR *root;&lt;br /&gt;
		char *buf=malloc (100*(sizeof(char)));&lt;br /&gt;
		struct dirent *d;&lt;br /&gt;
		i_node A[MAX];&lt;br /&gt;
&lt;br /&gt;
		if (argv[1]==NULL) &lt;br /&gt;
			{	&lt;br /&gt;
				&lt;br /&gt;
				getcwd(buf, MAX);		/* prendo directory corrente e la salvo in buf */&lt;br /&gt;
				if ((root = opendir (buf)) == NULL)&lt;br /&gt;
					{&lt;br /&gt;
						perror(&amp;quot;opendir&amp;quot;);&lt;br /&gt;
						return -1;	&lt;br /&gt;
					}&lt;br /&gt;
			}&lt;br /&gt;
		else &lt;br /&gt;
			{&lt;br /&gt;
				buf =argv[1];&lt;br /&gt;
				if ((root = opendir (buf)) == NULL)&lt;br /&gt;
					{&lt;br /&gt;
						perror(&amp;quot;opendir&amp;quot;);&lt;br /&gt;
						return -1;	&lt;br /&gt;
					}	&lt;br /&gt;
				chdir(buf);		/*cambio directory corrente con quella passato a linea di comando*/&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
		/*  SE VOGLIO STAMPARE SOLO I FILE REGOLARI&lt;br /&gt;
		while ((d=readdir (root))!=NULL)&lt;br /&gt;
			{			&lt;br /&gt;
				stat(d-&amp;gt;d_name,&amp;amp;f);&lt;br /&gt;
				if (S_ISREG(f.st_mode))	&lt;br /&gt;
					{&lt;br /&gt;
						A[x].nome = d-&amp;gt;d_name;&lt;br /&gt;
						A[x].nodo = d-&amp;gt;d_ino;			&lt;br /&gt;
						x++;&lt;br /&gt;
					}&lt;br /&gt;
			&lt;br /&gt;
			}&lt;br /&gt;
		*/&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
		/* scorro tutta la directory */&lt;br /&gt;
		while ((d=readdir (root))!=NULL) &lt;br /&gt;
			{			&lt;br /&gt;
						A[x].nome = d-&amp;gt;d_name;&lt;br /&gt;
						A[x].num = d-&amp;gt;d_ino;			&lt;br /&gt;
						x++;			&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
		qsort(A, x--, sizeof(i_node), confronto);  /* riodina seguendo la funzione &amp;quot;confronto&amp;quot; */&lt;br /&gt;
&lt;br /&gt;
		while (y&amp;lt;=x)&lt;br /&gt;
			{&lt;br /&gt;
				printf (&amp;quot;\n/%s ------ %d \n&amp;quot;, A[y].nome, A[y].num);&lt;br /&gt;
				y++;	&lt;br /&gt;
			}&lt;br /&gt;
	&lt;br /&gt;
	}  &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 09:36, 18 March 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=25.09.2015_esercizio_1&amp;diff=895</id>
		<title>25.09.2015 esercizio 1</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=25.09.2015_esercizio_1&amp;diff=895"/>
		<updated>2015-03-11T13:17:22Z</updated>

		<summary type="html">&lt;p&gt;Blissett: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_-_25.09.2014&amp;diff=894</id>
		<title>Esercizio 1 - 25.09.2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1_-_25.09.2014&amp;diff=894"/>
		<updated>2015-03-11T13:12:17Z</updated>

		<summary type="html">&lt;p&gt;Blissett: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;  Scrivere un programma che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi  tutti in esecuzione concorre...&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 che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi&lt;br /&gt;
 tutti in esecuzione concorrente e rimanga in attesa. Quando il primo termina, vengono terminati (con segnale SIGTERM) tutti&lt;br /&gt;
 gli altri. (consiglio: puo' essere utile usare la mia libreria s2argv-execs)&lt;br /&gt;
 esempio:&lt;br /&gt;
 wta commands&lt;br /&gt;
&lt;br /&gt;
 il file commands contiene:&lt;br /&gt;
 ./ttest 40&lt;br /&gt;
 ./ttest 10&lt;br /&gt;
 ./ttest 20&lt;br /&gt;
&lt;br /&gt;
 lo script ./ttest contiene:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo waiting for $1 seconds&lt;br /&gt;
 sleep $1&lt;br /&gt;
 echo done $1&lt;br /&gt;
&lt;br /&gt;
 l'ouptut sara':&lt;br /&gt;
 waiting for 40 seconds&lt;br /&gt;
 waiting for 10 seconds&lt;br /&gt;
 waiting for 20 seconds&lt;br /&gt;
 done 10&lt;br /&gt;
&lt;br /&gt;
 e poi basta perche' gli altri processi verranno terminati. &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Possibile soluzione ==&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;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;s2argv.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define MAX 20&lt;br /&gt;
 &lt;br /&gt;
 int contaRighe (FILE *A){&lt;br /&gt;
 		char *a;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		a= malloc (MAX*sizeof(char));&lt;br /&gt;
 &lt;br /&gt;
 		if (a==NULL) {	&lt;br /&gt;
 			perror (&amp;quot;malloc&amp;quot;);&lt;br /&gt;
 			return -1;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		while (fgets(a, MAX, A)){&lt;br /&gt;
 			if (*a==EOF || *a=='\n') break;			&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		return i;&lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main (int argc, char *argv []){&lt;br /&gt;
 		int status;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		int j=0;&lt;br /&gt;
 		int z=0; 	/*indice per ampiezza &amp;quot;pid_t ID&amp;quot; e &amp;quot;char *comando&amp;quot;*/&lt;br /&gt;
 		char *comando[z];&lt;br /&gt;
 		pid_t ID [z];   /* memorizza i pid di tutti i processi attivati */&lt;br /&gt;
 		pid_t terminato;   /* memorizza il pid del primo processo che termina*/&lt;br /&gt;
 &lt;br /&gt;
 		FILE *fd = fopen (argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
 		&lt;br /&gt;
 		if( fd==NULL ) {&lt;br /&gt;
 	    	perror(&amp;quot;Errore in apertura del file&amp;quot;);&lt;br /&gt;
 	    	return -1;&lt;br /&gt;
 	  	}&lt;br /&gt;
 		&lt;br /&gt;
 		j=contaRighe (fd);		/*ritorna il numero di righe del file dato in input*/&lt;br /&gt;
 		z=j;		/* setto gli array con il numero di righe del file contenente i comandi */&lt;br /&gt;
 		&lt;br /&gt;
 		rewind(fd);			/*ritorno all'inizio del file*/	&lt;br /&gt;
 &lt;br /&gt;
 		/* riempie &amp;quot;comando[z]&amp;quot; con tutti i comandi presenti nel file passato, i comando sono contati da 1 a z. */&lt;br /&gt;
 		while (j!=0){   &lt;br /&gt;
 			comando [i] = malloc (MAX*sizeof(char));&lt;br /&gt;
 			fgets(comando [i], MAX, fd);&lt;br /&gt;
 			i++;&lt;br /&gt;
 			j--;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i--;		/* diminuisco &amp;quot;i&amp;quot; di uno perchè prima di uscire dall'ultimo ciclo è aumentata di uno, &amp;quot;j&amp;quot; è uguale a 0 */  &lt;br /&gt;
 		&lt;br /&gt;
 		/*ESEGUE TUTTI I COMANDI */&lt;br /&gt;
 		while (i&amp;gt;=0){			&lt;br /&gt;
 			switch (ID[j]=fork()) {&lt;br /&gt;
 				case 0:	&lt;br /&gt;
 					execsp(comando[j]);				&lt;br /&gt;
 					perror(&amp;quot;exec&amp;quot;);&lt;br /&gt;
 				case -1:&lt;br /&gt;
 					perror (&amp;quot;fork&amp;quot;);&lt;br /&gt;
 					return -1;&lt;br /&gt;
 			}&lt;br /&gt;
 			i--;&lt;br /&gt;
 			j++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i=0;		/*setto &amp;quot;i&amp;quot; a 0 per il prossimo while */&lt;br /&gt;
 &lt;br /&gt;
 		terminato=wait(&amp;amp;status);&lt;br /&gt;
 		&lt;br /&gt;
 		/* TERMINA TUTTI I PROCESSI */&lt;br /&gt;
 		while(i&amp;lt;j){		/* &amp;quot;i&amp;quot; strettamente minore di &amp;quot;j&amp;quot; poichè nell'ultimo ciclo del precedente while viene incrementata di uno */&lt;br /&gt;
 			if (ID[i]!=terminato) {&lt;br /&gt;
  				printf (&amp;quot;Termina processo %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 				kill(ID[i], SIGTERM);		/* mando segnale di terminazione a tutti i PID che non sono ancora terminati */&lt;br /&gt;
 			}&lt;br /&gt;
 			else printf (&amp;quot;Processo completato %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		fclose (fd);	&lt;br /&gt;
 		return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 14:12, 11 March 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=893</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=893"/>
		<updated>2015-03-11T13:11:47Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &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 - 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>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=25.09.2015_esercizio_1&amp;diff=892</id>
		<title>25.09.2015 esercizio 1</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=25.09.2015_esercizio_1&amp;diff=892"/>
		<updated>2015-03-11T13:10:12Z</updated>

		<summary type="html">&lt;p&gt;Blissett: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;  Scrivere un programma che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi  tutti in esecuzione concorre...&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 che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi&lt;br /&gt;
 tutti in esecuzione concorrente e rimanga in attesa. Quando il primo termina, vengono terminati (con segnale SIGTERM) tutti&lt;br /&gt;
 gli altri. (consiglio: puo' essere utile usare la mia libreria s2argv-execs)&lt;br /&gt;
 esempio:&lt;br /&gt;
 wta commands&lt;br /&gt;
&lt;br /&gt;
 il file commands contiene:&lt;br /&gt;
 ./ttest 40&lt;br /&gt;
 ./ttest 10&lt;br /&gt;
 ./ttest 20&lt;br /&gt;
&lt;br /&gt;
 lo script ./ttest contiene:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo waiting for $1 seconds&lt;br /&gt;
 sleep $1&lt;br /&gt;
 echo done $1&lt;br /&gt;
&lt;br /&gt;
 l'ouptut sara':&lt;br /&gt;
 waiting for 40 seconds&lt;br /&gt;
 waiting for 10 seconds&lt;br /&gt;
 waiting for 20 seconds&lt;br /&gt;
 done 10&lt;br /&gt;
&lt;br /&gt;
 e poi basta perche' gli altri processi verranno terminati. &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Possibile soluzione ==&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;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;s2argv.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define MAX 20&lt;br /&gt;
 &lt;br /&gt;
 int contaRighe (FILE *A){&lt;br /&gt;
 		char *a;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		a= malloc (MAX*sizeof(char));&lt;br /&gt;
 &lt;br /&gt;
 		if (a==NULL) {	&lt;br /&gt;
 			perror (&amp;quot;malloc&amp;quot;);&lt;br /&gt;
 			return -1;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		while (fgets(a, MAX, A)){&lt;br /&gt;
 			if (*a==EOF || *a=='\n') break;			&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		return i;&lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main (int argc, char *argv []){&lt;br /&gt;
 		int status;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		int j=0;&lt;br /&gt;
 		int z=0; 	/*indice per ampiezza &amp;quot;pid_t ID&amp;quot; e &amp;quot;char *comando&amp;quot;*/&lt;br /&gt;
 		char *comando[z];&lt;br /&gt;
 		pid_t ID [z];   /* memorizza i pid di tutti i processi attivati */&lt;br /&gt;
 		pid_t terminato;   /* memorizza il pid del primo processo che termina*/&lt;br /&gt;
 &lt;br /&gt;
 		FILE *fd = fopen (argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
 		&lt;br /&gt;
 		if( fd==NULL ) {&lt;br /&gt;
 	    	perror(&amp;quot;Errore in apertura del file&amp;quot;);&lt;br /&gt;
 	    	return -1;&lt;br /&gt;
 	  	}&lt;br /&gt;
 		&lt;br /&gt;
 		j=contaRighe (fd);		/*ritorna il numero di righe del file dato in input*/&lt;br /&gt;
 		z=j;		/* setto gli array con il numero di righe del file contenente i comandi */&lt;br /&gt;
 		&lt;br /&gt;
 		rewind(fd);			/*ritorno all'inizio del file*/	&lt;br /&gt;
 &lt;br /&gt;
 		/* riempie &amp;quot;comando[z]&amp;quot; con tutti i comandi presenti nel file passato, i comando sono contati da 1 a z. */&lt;br /&gt;
 		while (j!=0){   &lt;br /&gt;
 			comando [i] = malloc (MAX*sizeof(char));&lt;br /&gt;
 			fgets(comando [i], MAX, fd);&lt;br /&gt;
 			i++;&lt;br /&gt;
 			j--;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i--;		/* diminuisco &amp;quot;i&amp;quot; di uno perchè prima di uscire dall'ultimo ciclo è aumentata di uno, &amp;quot;j&amp;quot; è uguale a 0 */  &lt;br /&gt;
 		&lt;br /&gt;
 		/*ESEGUE TUTTI I COMANDI */&lt;br /&gt;
 		while (i&amp;gt;=0){			&lt;br /&gt;
 			switch (ID[j]=fork()) {&lt;br /&gt;
 				case 0:	&lt;br /&gt;
 					execsp(comando[j]);				&lt;br /&gt;
 					perror(&amp;quot;exec&amp;quot;);&lt;br /&gt;
 				case -1:&lt;br /&gt;
 					perror (&amp;quot;fork&amp;quot;);&lt;br /&gt;
 					return -1;&lt;br /&gt;
 			}&lt;br /&gt;
 			i--;&lt;br /&gt;
 			j++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i=0;		/*setto &amp;quot;i&amp;quot; a 0 per il prossimo while */&lt;br /&gt;
 &lt;br /&gt;
 		terminato=wait(&amp;amp;status);&lt;br /&gt;
 		&lt;br /&gt;
 		/* TERMINA TUTTI I PROCESSI */&lt;br /&gt;
 		while(i&amp;lt;j){		/* &amp;quot;i&amp;quot; strettamente minore di &amp;quot;j&amp;quot; poichè nell'ultimo ciclo del precedente while viene incrementata di uno */&lt;br /&gt;
 			if (ID[i]!=terminato) {&lt;br /&gt;
  				printf (&amp;quot;Termina processo %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 				kill(ID[i], SIGTERM);		/* mando segnale di terminazione a tutti i PID che non sono ancora terminati */&lt;br /&gt;
 			}&lt;br /&gt;
 			else printf (&amp;quot;Processo completato %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		fclose (fd);	&lt;br /&gt;
 		return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 14:10, 11 March 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=891</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=891"/>
		<updated>2015-03-11T13:07:12Z</updated>

		<summary type="html">&lt;p&gt;Blissett: &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;
[[25.09.2015 esercizio 1]]&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>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Talk:Main_Page&amp;diff=890</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Talk:Main_Page&amp;diff=890"/>
		<updated>2015-03-11T13:03:01Z</updated>

		<summary type="html">&lt;p&gt;Blissett: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Talk:Main_Page&amp;diff=889</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Talk:Main_Page&amp;diff=889"/>
		<updated>2015-03-11T12:40:45Z</updated>

		<summary type="html">&lt;p&gt;Blissett: [25.09.2014] esercizio 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; Scrivere un programma che preso come parametro un file contenente un elenco di comandi (con I relativi parametri) li attivi&lt;br /&gt;
 tutti in esecuzione concorrente e rimanga in attesa. Quando il primo termina, vengono terminati (con segnale SIGTERM) tutti&lt;br /&gt;
 gli altri. (consiglio: puo' essere utile usare la mia libreria s2argv-execs)&lt;br /&gt;
 esempio:&lt;br /&gt;
 wta commands&lt;br /&gt;
 il file commands contiene:&lt;br /&gt;
 ./ttest 40&lt;br /&gt;
 ./ttest 10&lt;br /&gt;
 ./ttest 20&lt;br /&gt;
 lo script ./ttest contiene:&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 echo waiting for $1 seconds&lt;br /&gt;
 sleep $1&lt;br /&gt;
 echo done $i&lt;br /&gt;
 l'ouptut sara':&lt;br /&gt;
 waiting for 40 seconds&lt;br /&gt;
 waiting for 10 seconds&lt;br /&gt;
 waiting for 20 seconds&lt;br /&gt;
 done 10&lt;br /&gt;
 e poi basta perche' gli altri processi verranno terminati. &lt;br /&gt;
== Possibile soluzione ==&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&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;unistd.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;s2argv.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define MAX 20&lt;br /&gt;
 &lt;br /&gt;
 int contaRighe (FILE *A){&lt;br /&gt;
 		char *a;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		a= malloc (MAX*sizeof(char));&lt;br /&gt;
 &lt;br /&gt;
 		if (a==NULL) {	&lt;br /&gt;
 			perror (&amp;quot;malloc&amp;quot;);&lt;br /&gt;
 			return -1;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		while (fgets(a, MAX, A)){&lt;br /&gt;
 			if (*a==EOF || *a=='\n') break;			&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		return i;&lt;br /&gt;
 } &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 int main (int argc, char *argv []){&lt;br /&gt;
 		int status;&lt;br /&gt;
 		int i=0;&lt;br /&gt;
 		int j=0;&lt;br /&gt;
 		int z=0; 	/*indice per ampiezza &amp;quot;pid_t ID&amp;quot; e &amp;quot;char *comando&amp;quot;*/&lt;br /&gt;
 		char *comando[z];&lt;br /&gt;
 		pid_t ID [z];   /* memorizza i pid di tutti i processi attivati */&lt;br /&gt;
 		pid_t terminato;   /* memorizza il pid del primo processo che termina*/&lt;br /&gt;
 &lt;br /&gt;
 		FILE *fd = fopen (argv[1], &amp;quot;r&amp;quot;);&lt;br /&gt;
 		&lt;br /&gt;
 		if( fd==NULL ) {&lt;br /&gt;
 	    	perror(&amp;quot;Errore in apertura del file&amp;quot;);&lt;br /&gt;
 	    	return -1;&lt;br /&gt;
 	  	}&lt;br /&gt;
 		&lt;br /&gt;
 		j=contaRighe (fd);		/*ritorna il numero di righe del file dato in input*/&lt;br /&gt;
 		z=j;		/* setto gli array con il numero di righe del file contenente i comandi */&lt;br /&gt;
 		&lt;br /&gt;
 		rewind(fd);			/*ritorno all'inizio del file*/	&lt;br /&gt;
 &lt;br /&gt;
 		/* riempie &amp;quot;comando[z]&amp;quot; con tutti i comandi presenti nel file passato, i comando sono contati da 1 a z. */&lt;br /&gt;
 		while (j!=0){   &lt;br /&gt;
 			comando [i] = malloc (MAX*sizeof(char));&lt;br /&gt;
 			fgets(comando [i], MAX, fd);&lt;br /&gt;
 			i++;&lt;br /&gt;
 			j--;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i--;		/* diminuisco &amp;quot;i&amp;quot; di uno perchè prima di uscire dall'ultimo ciclo è aumentata di uno, &amp;quot;j&amp;quot; è uguale a 0 */  &lt;br /&gt;
 		&lt;br /&gt;
 		/*ESEGUE TUTTI I COMANDI */&lt;br /&gt;
 		while (i&amp;gt;=0){			&lt;br /&gt;
 			switch (ID[j]=fork()) {&lt;br /&gt;
 				case 0:	&lt;br /&gt;
 					execsp(comando[j]);				&lt;br /&gt;
 					perror(&amp;quot;exec&amp;quot;);&lt;br /&gt;
 				case -1:&lt;br /&gt;
 					perror (&amp;quot;fork&amp;quot;);&lt;br /&gt;
 					return -1;&lt;br /&gt;
 			}&lt;br /&gt;
 			i--;&lt;br /&gt;
 			j++;&lt;br /&gt;
 		}&lt;br /&gt;
 &lt;br /&gt;
 		i=0;		/*setto &amp;quot;i&amp;quot; a 0 per il prossimo while */&lt;br /&gt;
 &lt;br /&gt;
 		terminato=wait(&amp;amp;status);&lt;br /&gt;
 		&lt;br /&gt;
 		/* TERMINA TUTTI I PROCESSI */&lt;br /&gt;
 		while(i&amp;lt;j){		/* &amp;quot;i&amp;quot; strettamente minore di &amp;quot;j&amp;quot; poichè nell'ultimo ciclo del precedente while viene incrementata di uno */&lt;br /&gt;
 			if (ID[i]!=terminato) {&lt;br /&gt;
  				printf (&amp;quot;Termina processo %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 				kill(ID[i], SIGTERM);		/* mando segnale di terminazione a tutti i PID che non sono ancora terminati */&lt;br /&gt;
 			}&lt;br /&gt;
 			else printf (&amp;quot;Processo completato %d\n&amp;quot;,ID[i]);&lt;br /&gt;
 			i++;&lt;br /&gt;
 		}&lt;br /&gt;
 		&lt;br /&gt;
 		fclose (fd);	&lt;br /&gt;
 		return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
--[[User:Blissett|Blissett]] ([[User talk:Blissett|talk]]) 13:40, 11 March 2015 (CET)&lt;/div&gt;</summary>
		<author><name>Blissett</name></author>
	</entry>
</feed>