<?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=Edu+san</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=Edu+san"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Edu_san"/>
	<updated>2026-05-06T03:14:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=721</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=721"/>
		<updated>2014-05-14T01:22:04Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&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;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 1:(visto a lezione , soluzione del Prof. Davoli   Pirata_20131203)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
 &lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd , n , i;&lt;br /&gt;
	uint64_t a , b;&lt;br /&gt;
	if ( ( efd = eventfd( 0 , EFD_SEMAPHORE ) ) &amp;lt; 0 )&lt;br /&gt;
		exit( 1 );&lt;br /&gt;
	if ( fork() &amp;gt; 0 ){&lt;br /&gt;
		while ( 1 ) {&lt;br /&gt;
		uint64_t a;&lt;br /&gt;
		scanf( &amp;quot;%lld&amp;quot; , &amp;amp;a );&lt;br /&gt;
		write( efd , &amp;amp;a , sizeof( a ) );&lt;br /&gt;
				}&lt;br /&gt;
		}&lt;br /&gt;
	else {&lt;br /&gt;
		while ( 1 ) {&lt;br /&gt;
		uint64_t b;&lt;br /&gt;
		read( efd , &amp;amp;b , sizeof( b ) );&lt;br /&gt;
		printf( &amp;quot;x\n&amp;quot; );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 3 in bash(Pirata &amp;amp; Fede):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*.* ; do&lt;br /&gt;
	somma=0&lt;br /&gt;
	ext=${f##*.}&lt;br /&gt;
	for file in *.&amp;quot;$ext&amp;quot;&lt;br /&gt;
	do&lt;br /&gt;
		somma=$(expr $somma + $(stat -c%s &amp;quot;$file&amp;quot;))&lt;br /&gt;
	done&lt;br /&gt;
	echo -n &amp;quot;size of file with extension &amp;quot;$ext&amp;quot; : &amp;quot;&lt;br /&gt;
	echo &amp;quot;$somma&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Per (Pirata &amp;amp; Fede) -Bash-: ci siamo quasi...però forse rifate gli stessi calcoli un po' di volte in più del necessario ;-) (am_20131127).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[Esercizio 3 in Python (ancora)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
#&lt;br /&gt;
# Prova Pratica di Lab SO 2013.05.29&lt;br /&gt;
# Es. 3&lt;br /&gt;
# Eduardo Santarelli&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
# return the suffix of file named fname, if present.&lt;br /&gt;
# return boolean value False otherwise&lt;br /&gt;
def get_suffix(fname):&lt;br /&gt;
	if '.' in fname:&lt;br /&gt;
		separator = fname.find('.')&lt;br /&gt;
		return fname[separator : ]&lt;br /&gt;
	else:&lt;br /&gt;
		return False	&lt;br /&gt;
&lt;br /&gt;
# Place a file in a dictionary. Each key corresponds&lt;br /&gt;
# to a specific suffix, its value is a list of all the&lt;br /&gt;
# file with that suffix&lt;br /&gt;
def build_dict(item, suffix):&lt;br /&gt;
	if suffix in all_files:&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
	else:&lt;br /&gt;
		all_files[suffix] = []&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
&lt;br /&gt;
# For each suffix key in the dictionary,&lt;br /&gt;
# calculates the total size of the files&lt;br /&gt;
# in the corresponding list&lt;br /&gt;
def size_of_entry(file_list):&lt;br /&gt;
		size = 0&lt;br /&gt;
		for item in file_list:&lt;br /&gt;
			size += os.path.getsize(item)&lt;br /&gt;
		return size&lt;br /&gt;
&lt;br /&gt;
# This dictionary will contain a key for each suffix,&lt;br /&gt;
# associated with a list of all the files ending with&lt;br /&gt;
# that suffix&lt;br /&gt;
all_files = dict()&lt;br /&gt;
&lt;br /&gt;
# Go to target directory and build a list containing all filenames&lt;br /&gt;
try:&lt;br /&gt;
	target_dir = sys.argv[1]&lt;br /&gt;
except:&lt;br /&gt;
	target_dir = '.'&lt;br /&gt;
os.chdir(target_dir)&lt;br /&gt;
dir_list = os.listdir('.')&lt;br /&gt;
&lt;br /&gt;
# For each file call get_suffix and then build_dict&lt;br /&gt;
# (unless get_suffix returns False)&lt;br /&gt;
for item in dir_list:&lt;br /&gt;
	suffix = get_suffix(item)&lt;br /&gt;
	if not suffix:&lt;br /&gt;
		pass&lt;br /&gt;
	else:&lt;br /&gt;
		build_dict(item, suffix)&lt;br /&gt;
&lt;br /&gt;
for key in all_files :&lt;br /&gt;
	print(&amp;quot;{0}: {1} Bytes&amp;quot;.format(key, size_of_entry(all_files[key])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
--edit: dir_list = os.listdir(target_dir) non funzionava bene coi path relativi.&lt;br /&gt;
Ora os.listdir('.') dovrebbe andare bene.&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
[es.2 - C]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SIZE 64&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv){&lt;br /&gt;
	int efd_parent, efd_child;&lt;br /&gt;
	pid_t pid;&lt;br /&gt;
&lt;br /&gt;
	efd_parent = eventfd(0, 0);&lt;br /&gt;
	efd_child = eventfd(0, 0);&lt;br /&gt;
&lt;br /&gt;
	pid = fork();&lt;br /&gt;
	if(pid &amp;lt; 0){&lt;br /&gt;
		perror(&amp;quot;Fork error. &amp;quot;);&lt;br /&gt;
		exit(EXIT_FAILURE);&lt;br /&gt;
	}&lt;br /&gt;
	/* parent */&lt;br /&gt;
	if(pid){&lt;br /&gt;
		int okToWrite = 1;&lt;br /&gt;
		ssize_t n;&lt;br /&gt;
		char buf[SIZE];&lt;br /&gt;
&lt;br /&gt;
		for(;;){&lt;br /&gt;
			if(okToWrite){&lt;br /&gt;
				scanf(&amp;quot;%s&amp;quot;, buf);&lt;br /&gt;
			&lt;br /&gt;
				n = write(efd_parent, buf, SIZE);&lt;br /&gt;
				if(n &amp;lt; 0){&lt;br /&gt;
					perror(&amp;quot;Parent: write error.&amp;quot;);&lt;br /&gt;
					exit(EXIT_FAILURE);&lt;br /&gt;
				}&lt;br /&gt;
			okToWrite = 1-okToWrite;&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				n = read(efd_child, buf, SIZE);&lt;br /&gt;
				if( n &amp;lt; sizeof(uint64_t) ){&lt;br /&gt;
					printf(&amp;quot;Parent: something bad happened&amp;quot;);&lt;br /&gt;
					exit(EXIT_FAILURE);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				printf(&amp;quot;padre: %s\n&amp;quot;, buf);&lt;br /&gt;
				okToWrite = 1-okToWrite;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(efd_parent);&lt;br /&gt;
	}&lt;br /&gt;
	/* child */&lt;br /&gt;
	else{&lt;br /&gt;
		int okToWrite = 0;&lt;br /&gt;
		char buf[SIZE];&lt;br /&gt;
		int n;&lt;br /&gt;
	&lt;br /&gt;
		for(;;){&lt;br /&gt;
			if(okToWrite){&lt;br /&gt;
				scanf(&amp;quot;%s&amp;quot;, buf);&lt;br /&gt;
			&lt;br /&gt;
				n = write(efd_child, buf, SIZE);&lt;br /&gt;
				if(n &amp;lt; 0){&lt;br /&gt;
					perror(&amp;quot;child: write error.&amp;quot;);&lt;br /&gt;
					exit(EXIT_FAILURE);&lt;br /&gt;
				}&lt;br /&gt;
				okToWrite = 1-okToWrite;&lt;br /&gt;
			}&lt;br /&gt;
			else{&lt;br /&gt;
				n = read(efd_parent, buf, SIZE);&lt;br /&gt;
				if( n &amp;lt; sizeof(uint64_t) ){&lt;br /&gt;
					printf(&amp;quot;Child: something bad happened&amp;quot;);&lt;br /&gt;
					exit(EXIT_FAILURE);&lt;br /&gt;
				}&lt;br /&gt;
				printf(&amp;quot;figlio: %s\n&amp;quot;, buf);&lt;br /&gt;
				okToWrite = 1-okToWrite;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		close(efd_child);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
- Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=635</id>
		<title>ProvaPratica 2012.09.19</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=635"/>
		<updated>2014-04-30T13:29:08Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
URL-&amp;gt; http://www.cs.unibo.it/~renzo/so/pratiche/2012.09.19.pdf&lt;br /&gt;
----&lt;br /&gt;
[C Esercizio 1]&lt;br /&gt;
&amp;lt;syntaxhighlight 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;signal.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;limits.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFSIZE 1024&lt;br /&gt;
&lt;br /&gt;
long int n = 0;&lt;br /&gt;
&lt;br /&gt;
void handler(int sig_num){&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;\n%ld Bytes copied until now\n&amp;quot;, n);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	int nread, nwritten,&lt;br /&gt;
	    i = 0;&lt;br /&gt;
	char buffer[BUFSIZE],&lt;br /&gt;
	     cool_gui[] = &amp;quot;-\\|/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;Copying   &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while( (nread = read(STDIN_FILENO, buffer, BUFSIZE)) != 0 ){&lt;br /&gt;
		if(nread &amp;lt; 0){&lt;br /&gt;
			perror(&amp;quot;Read error: &amp;quot;);&lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		nwritten = write(STDOUT_FILENO, buffer, nread);&lt;br /&gt;
                if(nwritten &amp;lt; 0){&lt;br /&gt;
                        perror(&amp;quot;Write error: &amp;quot;);&lt;br /&gt;
                        exit(EXIT_FAILURE);&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
		n += nwritten&lt;br /&gt;
		fprintf(stderr, &amp;quot;\b\b%c &amp;quot;,cool_gui[i%4]);&lt;br /&gt;
		(i == INT_MAX) ? (i=0) : (i++); 	&lt;br /&gt;
	}&lt;br /&gt;
			&lt;br /&gt;
	fprintf(stderr, &amp;quot;\nDone\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[Bash Esercizio 3]&lt;br /&gt;
In due versioni:&amp;lt;br&amp;gt;&lt;br /&gt;
1. one-liner, per amore di leggibilità&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 IFS=$(echo -ne &amp;quot;\n\b&amp;quot;) &amp;amp;&amp;amp; file `find $DIRECTORY` | sed -rn &amp;quot;s/(.*):\ +`file -b $FILENAME`/\1/p&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Purtroppo se esistono troppi file nell'albero della directory non funziona (Argument list too long)&amp;lt;br&amp;gt;&lt;br /&gt;
2. script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SUCCESS=0&lt;br /&gt;
FAILURE=1&lt;br /&gt;
&lt;br /&gt;
#Check arguments&lt;br /&gt;
if [[ $# -ne 2 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: `basename $0` file directory&amp;quot;&lt;br /&gt;
	exit $FAILURE&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
IFS=$(echo -e &amp;quot;\n\b&amp;quot;)        #set newline as separator&lt;br /&gt;
file_type=$(file -b $1)&lt;br /&gt;
file_list=$(find $2) &lt;br /&gt;
&lt;br /&gt;
for item in $file_list&lt;br /&gt;
do&lt;br /&gt;
	item_type=$(file -b $item)&lt;br /&gt;
	if [[ $item_type == $file_type ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo $item&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit $SUCCESS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La riga di codice per settare il separatore l'ho trovata qui: http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html . Non mi è chiaro perchè il separatore debba essere &amp;quot;\n\b&amp;quot; e non solo &amp;quot;\n&amp;quot;, ma ho provato in varie salse, e questo è l'unico modo in cui lo script funziona.&amp;lt;br&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=634</id>
		<title>ProvaPratica 2012.09.19</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=634"/>
		<updated>2014-04-30T13:27:47Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
URL-&amp;gt; http://www.cs.unibo.it/~renzo/so/pratiche/2012.09.19.pdf&lt;br /&gt;
----&lt;br /&gt;
[C Esercizio 1]&lt;br /&gt;
&amp;lt;syntaxhighlight 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;signal.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;limits.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFSIZE 1024&lt;br /&gt;
&lt;br /&gt;
long int n = 0;&lt;br /&gt;
&lt;br /&gt;
void handler(int sig_num){&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;\n%ld Bytes copied until now\n&amp;quot;, n);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	int nread, nwritten,&lt;br /&gt;
	    i = 0;&lt;br /&gt;
	char buffer[BUFSIZE],&lt;br /&gt;
	     cool_gui[] = &amp;quot;-\\|/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;Copying   &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while( (nread = read(STDIN_FILENO, buffer, BUFSIZE)) != 0 ){&lt;br /&gt;
		if(nread &amp;lt; 0){&lt;br /&gt;
			perror(&amp;quot;Read error: &amp;quot;);&lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		nwritten = write(STDOUT_FILENO, buffer, nread);&lt;br /&gt;
&lt;br /&gt;
		n += nwritten&lt;br /&gt;
		fprintf(stderr, &amp;quot;\b\b%c &amp;quot;,cool_gui[i%4]);&lt;br /&gt;
		(i == INT_MAX) ? (i=0) : (i++); 	&lt;br /&gt;
	}&lt;br /&gt;
			&lt;br /&gt;
	fprintf(stderr, &amp;quot;\nDone\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[Bash Esercizio 3]&lt;br /&gt;
In due versioni:&amp;lt;br&amp;gt;&lt;br /&gt;
1. one-liner, per amore di leggibilità&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 IFS=$(echo -ne &amp;quot;\n\b&amp;quot;) &amp;amp;&amp;amp; file `find $DIRECTORY` | sed -rn &amp;quot;s/(.*):\ +`file -b $FILENAME`/\1/p&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Purtroppo se esistono troppi file nell'albero della directory non funziona (Argument list too long)&amp;lt;br&amp;gt;&lt;br /&gt;
2. script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SUCCESS=0&lt;br /&gt;
FAILURE=1&lt;br /&gt;
&lt;br /&gt;
#Check arguments&lt;br /&gt;
if [[ $# -ne 2 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: `basename $0` file directory&amp;quot;&lt;br /&gt;
	exit $FAILURE&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
IFS=$(echo -e &amp;quot;\n\b&amp;quot;)        #set newline as separator&lt;br /&gt;
file_type=$(file -b $1)&lt;br /&gt;
file_list=$(find $2) &lt;br /&gt;
&lt;br /&gt;
for item in $file_list&lt;br /&gt;
do&lt;br /&gt;
	item_type=$(file -b $item)&lt;br /&gt;
	if [[ $item_type == $file_type ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo $item&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit $SUCCESS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La riga di codice per settare il separatore l'ho trovata qui: http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html . Non mi è chiaro perchè il separatore debba essere &amp;quot;\n\b&amp;quot; e non solo &amp;quot;\n&amp;quot;, ma ho provato in varie salse, e questo è l'unico modo in cui lo script funziona.&amp;lt;br&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=633</id>
		<title>ProvaPratica 2012.09.19</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=633"/>
		<updated>2014-04-30T13:26:52Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
URL-&amp;gt; http://www.cs.unibo.it/~renzo/so/pratiche/2012.09.19.pdf&lt;br /&gt;
----&lt;br /&gt;
[C Esercizio 1]&lt;br /&gt;
&amp;lt;syntaxhighlight 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;signal.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;limits.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BUFSIZE 1024&lt;br /&gt;
&lt;br /&gt;
long int n = 0;&lt;br /&gt;
&lt;br /&gt;
void handler(int sig_num){&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;\n%ld Bytes copied until now\n&amp;quot;, n);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
	int nread, nwritten,&lt;br /&gt;
			i = 0;&lt;br /&gt;
	char buffer[BUFSIZE],&lt;br /&gt;
			 cool_gui[] = &amp;quot;-\\|/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	signal(SIGUSR1, handler);&lt;br /&gt;
	fprintf(stderr, &amp;quot;Copying   &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while( (nread = read(STDIN_FILENO, buffer, BUFSIZE)) != 0 ){&lt;br /&gt;
		if(nread &amp;lt; 0){&lt;br /&gt;
			perror(&amp;quot;Read error: &amp;quot;);&lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		nwritten = write(STDOUT_FILENO, buffer, nread);&lt;br /&gt;
&lt;br /&gt;
		n += nwritten&lt;br /&gt;
		fprintf(stderr, &amp;quot;\b\b%c &amp;quot;,cool_gui[i%4]);&lt;br /&gt;
		(i == INT_MAX) ? (i=0) : (i++); 	&lt;br /&gt;
	}&lt;br /&gt;
			&lt;br /&gt;
	fprintf(stderr, &amp;quot;\nDone\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[Bash Esercizio 3]&lt;br /&gt;
In due versioni:&amp;lt;br&amp;gt;&lt;br /&gt;
1. one-liner, per amore di leggibilità&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 IFS=$(echo -ne &amp;quot;\n\b&amp;quot;) &amp;amp;&amp;amp; file `find $DIRECTORY` | sed -rn &amp;quot;s/(.*):\ +`file -b $FILENAME`/\1/p&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Purtroppo se esistono troppi file nell'albero della directory non funziona (Argument list too long)&amp;lt;br&amp;gt;&lt;br /&gt;
2. script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SUCCESS=0&lt;br /&gt;
FAILURE=1&lt;br /&gt;
&lt;br /&gt;
#Check arguments&lt;br /&gt;
if [[ $# -ne 2 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: `basename $0` file directory&amp;quot;&lt;br /&gt;
	exit $FAILURE&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
IFS=$(echo -e &amp;quot;\n\b&amp;quot;)        #set newline as separator&lt;br /&gt;
file_type=$(file -b $1)&lt;br /&gt;
file_list=$(find $2) &lt;br /&gt;
&lt;br /&gt;
for item in $file_list&lt;br /&gt;
do&lt;br /&gt;
	item_type=$(file -b $item)&lt;br /&gt;
	if [[ $item_type == $file_type ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo $item&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit $SUCCESS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La riga di codice per settare il separatore l'ho trovata qui: http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html . Non mi è chiaro perchè il separatore debba essere &amp;quot;\n\b&amp;quot; e non solo &amp;quot;\n&amp;quot;, ma ho provato in varie salse, e questo è l'unico modo in cui lo script funziona.&amp;lt;br&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=624</id>
		<title>ProvaPratica 2012.09.19</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.09.19&amp;diff=624"/>
		<updated>2014-04-29T23:20:43Z</updated>

		<summary type="html">&lt;p&gt;Edu san: Created page with &amp;quot; URL-&amp;gt; http://www.cs.unibo.it/~renzo/so/pratiche/2012.09.19.pdf ---- [Bash esercizio 3] In due versioni:&amp;lt;br&amp;gt; 1. one-liner, per amore di leggibilità &amp;lt;syntaxhighlight lang=&amp;quot;Bas...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
URL-&amp;gt; http://www.cs.unibo.it/~renzo/so/pratiche/2012.09.19.pdf&lt;br /&gt;
----&lt;br /&gt;
[Bash esercizio 3]&lt;br /&gt;
In due versioni:&amp;lt;br&amp;gt;&lt;br /&gt;
1. one-liner, per amore di leggibilità&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
 IFS=$(echo -ne &amp;quot;\n\b&amp;quot;) &amp;amp;&amp;amp; file `find $DIRECTORY` | sed -rn &amp;quot;s/(.*):\ +`file -b $FILENAME`/\1/p&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Purtroppo se esistono troppi file nell'albero della directory non funziona (Argument list too long)&amp;lt;br&amp;gt;&lt;br /&gt;
2. script&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
SUCCESS=0&lt;br /&gt;
FAILURE=1&lt;br /&gt;
&lt;br /&gt;
#Check arguments&lt;br /&gt;
if [[ $# -ne 2 ]]&lt;br /&gt;
then&lt;br /&gt;
	echo &amp;quot;Usage: `basename $0` file directory&amp;quot;&lt;br /&gt;
	exit $FAILURE&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
IFS=$(echo -e &amp;quot;\n\b&amp;quot;)        #set newline as separator&lt;br /&gt;
file_type=$(file -b $1)&lt;br /&gt;
file_list=$(find $2) &lt;br /&gt;
&lt;br /&gt;
for item in $file_list&lt;br /&gt;
do&lt;br /&gt;
	item_type=$(file -b $item)&lt;br /&gt;
	if [[ $item_type == $file_type ]]&lt;br /&gt;
	then&lt;br /&gt;
		echo $item&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit $SUCCESS&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
La riga di codice per settare il separatore l'ho trovata qui: http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html . Non mi è chiaro perchè il separatore debba essere &amp;quot;\n\b&amp;quot; e non solo &amp;quot;\n&amp;quot;, ma ho provato in varie salse, e questo è l'unico modo in cui lo script funziona.&lt;br /&gt;
Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=623</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=623"/>
		<updated>2014-04-29T22:19:45Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Decalogo di Programmazione Concorrente]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&lt;br /&gt;
[[Producer&amp;amp;Consumer MP.]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2014.01.23]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.09.13]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.07.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.05.29]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.01.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2012.09.19]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2005.02.10]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeoria_2011.07.25]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.02.09]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.05.24]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.06.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2012.09.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica_2011.02.11]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2013.07.19]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2013.01.24]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2014.01.22]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaTeorica 2012.07.16]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica_2010.07.12]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2008.01.16]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2013.09.12]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2009.09.18]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2008.09.17]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2007.09.07]]&lt;br /&gt;
&lt;br /&gt;
[[Prova Teorica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2010.02.03]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2011.09.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2009.02.12]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2009.01.15]]&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>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.09.13&amp;diff=406</id>
		<title>ProvaPratica 2013.09.13</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.09.13&amp;diff=406"/>
		<updated>2014-03-09T18:31:28Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[C esercizio 1 e 2]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 /***********************************************************************&lt;br /&gt;
 * Prova Pratica di Laboratorio di Sistemi Operativi			*&lt;br /&gt;
 * 13 settembre 2013							*&lt;br /&gt;
 * Esercizio 1+2							*&lt;br /&gt;
 * 									*&lt;br /&gt;
 * URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.09.13.pdf 	*&lt;br /&gt;
 * Autore: Eduardo Santarelli						*&lt;br /&gt;
 ************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* An entry in the hash table. */&lt;br /&gt;
typedef struct fileEntry{&lt;br /&gt;
&lt;br /&gt;
	const char *filename;&lt;br /&gt;
	struct fileEntry *next;&lt;br /&gt;
&lt;br /&gt;
} fileEntry;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Global variables */&lt;br /&gt;
fileEntry **table = NULL;&lt;br /&gt;
int table_size;&lt;br /&gt;
&lt;br /&gt;
/* Hash function. Calculates XOR of 8-bytes blocks		*&lt;br /&gt;
 * (actually, sizeof(long int)) read from the input file	*/&lt;br /&gt;
unsigned int hash(const char *fname){&lt;br /&gt;
&lt;br /&gt;
	FILE *f;&lt;br /&gt;
	unsigned long int hash_val = 0;&lt;br /&gt;
	unsigned long int tmp = 0;&lt;br /&gt;
&lt;br /&gt;
	f = fopen(fname, &amp;quot;r&amp;quot;);&lt;br /&gt;
	fread(&amp;amp;hash_val, sizeof(unsigned long int), 1, f);&lt;br /&gt;
&lt;br /&gt;
	while((fread(&amp;amp;tmp, sizeof(unsigned long int), 1, f) == 1))&lt;br /&gt;
		hash_val = hash_val^tmp;&lt;br /&gt;
&lt;br /&gt;
	fclose(f);&lt;br /&gt;
	return hash_val;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Creates a table of struct fileEntry elements, based on the hash values of the files	*&lt;br /&gt;
 * detected by scandir. If a collision is detected, the new entry is pointed by the	*&lt;br /&gt;
 * 'next' field of the current last element*/&lt;br /&gt;
void populate_table(struct dirent *dir_list[], int n){&lt;br /&gt;
&lt;br /&gt;
	int i;&lt;br /&gt;
	&lt;br /&gt;
	table_size = 2*n;	&lt;br /&gt;
	table = (fileEntry**)calloc(table_size, sizeof(fileEntry));&lt;br /&gt;
	if(!table) abort();&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;n; i++){&lt;br /&gt;
		unsigned int index;&lt;br /&gt;
		fileEntry *entry = NULL;&lt;br /&gt;
&lt;br /&gt;
		entry = (fileEntry*)malloc(sizeof(fileEntry));&lt;br /&gt;
		if(!entry) abort();&lt;br /&gt;
&lt;br /&gt;
		index = hash(dir_list[i]-&amp;gt;d_name)%table_size;&lt;br /&gt;
		if(table[index] == NULL){&lt;br /&gt;
			entry-&amp;gt;filename = dir_list[i]-&amp;gt;d_name;&lt;br /&gt;
			entry-&amp;gt;next = NULL;&lt;br /&gt;
			table[index] = entry;&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			entry-&amp;gt;filename = dir_list[i]-&amp;gt;d_name;&lt;br /&gt;
			entry-&amp;gt;next = table[index];&lt;br /&gt;
			table[index] = entry;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Compares two files */&lt;br /&gt;
int fcompare(const char *f1, const char *f2){&lt;br /&gt;
&lt;br /&gt;
	FILE *f, *g;&lt;br /&gt;
	int file1, file2;	&lt;br /&gt;
&lt;br /&gt;
	f = fopen(f1, &amp;quot;r&amp;quot;);&lt;br /&gt;
	g = fopen(f2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while(fread(&amp;amp;file1, sizeof(int), 1, f) &amp;amp;&amp;amp; fread(&amp;amp;file2, sizeof(int), 1, g)){&lt;br /&gt;
		if(file1!=file2){&lt;br /&gt;
			fclose(f);&lt;br /&gt;
			fclose(g);&lt;br /&gt;
			return 0;&lt;br /&gt;
 		}&lt;br /&gt;
	}&lt;br /&gt;
	fclose(f);&lt;br /&gt;
	fclose(g);&lt;br /&gt;
	return 1;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
/* This function scans the file table. If an entry contains more than one file,	*&lt;br /&gt;
 * it compares all them. If a duplicate is found, the first file is removed,  	*&lt;br /&gt;
 * and a hard link is created with the deleted file's name, pointing to the	*&lt;br /&gt;
 * second, identical, file.							*/&lt;br /&gt;
void deduplicate(){&lt;br /&gt;
&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;table_size; i++){&lt;br /&gt;
		while(table[i] != NULL &amp;amp;&amp;amp; table[i]-&amp;gt;next != NULL){&lt;br /&gt;
&lt;br /&gt;
			fileEntry *file1, *file2;&lt;br /&gt;
			file1 = table[i];&lt;br /&gt;
			file2 = table[i]-&amp;gt;next;&lt;br /&gt;
			while(file2 != NULL){&lt;br /&gt;
				if(fcompare(file1-&amp;gt;filename, file2-&amp;gt;filename)){&lt;br /&gt;
					unlink(file1-&amp;gt;filename);&lt;br /&gt;
					link(file2-&amp;gt;filename, file1-&amp;gt;filename);&lt;br /&gt;
					printf(&amp;quot;%s -&amp;gt; %s\n&amp;quot;, file1-&amp;gt;filename, file2-&amp;gt;filename);&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				file2 = file2-&amp;gt;next;&lt;br /&gt;
			}&lt;br /&gt;
			table[i] = table[i]-&amp;gt;next;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*selector function for scandir() */&lt;br /&gt;
int exclude(const struct dirent *dir){&lt;br /&gt;
&lt;br /&gt;
	if(dir-&amp;gt;d_type != DT_REG)&lt;br /&gt;
		return 0;&lt;br /&gt;
	else&lt;br /&gt;
		return 1;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
&lt;br /&gt;
	struct dirent **entries = NULL;&lt;br /&gt;
	int num_files;&lt;br /&gt;
&lt;br /&gt;
	num_files = scandir(&amp;quot;.&amp;quot;, &amp;amp;entries, exclude, alphasort);&lt;br /&gt;
&lt;br /&gt;
	populate_table(entries, num_files);&lt;br /&gt;
	deduplicate();&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
------&lt;br /&gt;
&lt;br /&gt;
[Python esercizio 3]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
 &lt;br /&gt;
# Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
# 13 settembre 2013&lt;br /&gt;
# Esercizio 3&lt;br /&gt;
#&lt;br /&gt;
# URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.09.13.pdf 	*&lt;br /&gt;
# Autore: Eduardo Santarelli&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class LineCounter:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, fileList):&lt;br /&gt;
        # A list containing the char-per-line&lt;br /&gt;
        # count for the specified files.&lt;br /&gt;
        # Value for line 1 is in result[0] and so on.&lt;br /&gt;
        self.result = []&lt;br /&gt;
        self.files = fileList # List of files to elaborate.&lt;br /&gt;
        self.getLinesCount()&lt;br /&gt;
&lt;br /&gt;
    # Count the chars for each lines of specified file,&lt;br /&gt;
    # add the result to the relevant field in self.result,&lt;br /&gt;
    # if already present, append the value to the&lt;br /&gt;
    # end of the list if not.&lt;br /&gt;
    def countLines(self, file):&lt;br /&gt;
        i = 0&lt;br /&gt;
        fd = open(file)&lt;br /&gt;
        for line in fd:&lt;br /&gt;
            lineLength = len(line)&lt;br /&gt;
            # If an entry for the current line does&lt;br /&gt;
            # not exist, append the value to the end of the list&lt;br /&gt;
            try:&lt;br /&gt;
                self.result[i] += lineLength&lt;br /&gt;
            except IndexError:&lt;br /&gt;
                self.result.append(lineLength)&lt;br /&gt;
            i = i+1&lt;br /&gt;
        fd.close()&lt;br /&gt;
&lt;br /&gt;
    # Call self.countLines() for each file in self.files&lt;br /&gt;
    # in order to build the self.result list&lt;br /&gt;
    def getLinesCount(self):&lt;br /&gt;
        for entry in self.files:&lt;br /&gt;
            self.countLines(entry)&lt;br /&gt;
&lt;br /&gt;
    # Print the items in self.result, each preceded by the&lt;br /&gt;
    # corresponding line number.&lt;br /&gt;
    def printLines(self):&lt;br /&gt;
        i = 1&lt;br /&gt;
        for value in self.result:&lt;br /&gt;
            print(&amp;quot;{:d}: {:d}&amp;quot;.format(i, value))&lt;br /&gt;
            i = i+1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
lc = LineCounter(os.listdir(os.getcwd()))&lt;br /&gt;
lc.printLines()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.09.13&amp;diff=405</id>
		<title>ProvaPratica 2013.09.13</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.09.13&amp;diff=405"/>
		<updated>2014-03-04T23:58:31Z</updated>

		<summary type="html">&lt;p&gt;Edu san: Created page with &amp;quot;[C esercizio 1 e 2] &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;   /***********************************************************************  * Prova Pratica di Laboratorio di Sistemi Operativi	...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[C esercizio 1 e 2]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 /***********************************************************************&lt;br /&gt;
 * Prova Pratica di Laboratorio di Sistemi Operativi			*&lt;br /&gt;
 * 13 settembre 2013							*&lt;br /&gt;
 * Esercizio 1+2							*&lt;br /&gt;
 * 									*&lt;br /&gt;
 * URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.09.13.pdf 	*&lt;br /&gt;
 * Autore: Eduardo Santarelli						*&lt;br /&gt;
 ************************************************************************/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* An entry in the hash table. */&lt;br /&gt;
typedef struct fileEntry{&lt;br /&gt;
&lt;br /&gt;
	const char *filename;&lt;br /&gt;
	struct fileEntry *next;&lt;br /&gt;
&lt;br /&gt;
} fileEntry;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Global variables */&lt;br /&gt;
fileEntry **table = NULL;&lt;br /&gt;
int table_size;&lt;br /&gt;
&lt;br /&gt;
/* Hash function. Calculates XOR of 8-bytes blocks		*&lt;br /&gt;
 * (actually, sizeof(long int)) read from the input file	*/&lt;br /&gt;
unsigned int hash(const char *fname){&lt;br /&gt;
&lt;br /&gt;
	FILE *f;&lt;br /&gt;
	unsigned long int hash_val = 0;&lt;br /&gt;
	unsigned long int tmp = 0;&lt;br /&gt;
&lt;br /&gt;
	f = fopen(fname, &amp;quot;r&amp;quot;);&lt;br /&gt;
	fread(&amp;amp;hash_val, sizeof(unsigned long int), 1, f);&lt;br /&gt;
&lt;br /&gt;
	while((fread(&amp;amp;tmp, sizeof(unsigned long int), 1, f) == 1))&lt;br /&gt;
		hash_val = hash_val^tmp;&lt;br /&gt;
&lt;br /&gt;
	fclose(f);&lt;br /&gt;
	return hash_val;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Creates a table of struct fileEntry elements, based on the hash values of the files	*&lt;br /&gt;
 * detected by scandir. If a collision is detected, the new entry is pointed by the	*&lt;br /&gt;
 * 'next' field of the current last element*/&lt;br /&gt;
void populate_table(struct dirent *dir_list[], int n){&lt;br /&gt;
&lt;br /&gt;
	int i;&lt;br /&gt;
	&lt;br /&gt;
	table_size = 2*n;	&lt;br /&gt;
	table = (fileEntry**)calloc(table_size, sizeof(fileEntry));&lt;br /&gt;
	if(!table) abort();&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;n; i++){&lt;br /&gt;
		unsigned int index;&lt;br /&gt;
		fileEntry *entry = NULL;&lt;br /&gt;
&lt;br /&gt;
		entry = (fileEntry*)malloc(sizeof(fileEntry));&lt;br /&gt;
		if(!entry) abort();&lt;br /&gt;
&lt;br /&gt;
		index = hash(dir_list[i]-&amp;gt;d_name)%table_size;&lt;br /&gt;
		if(table[index] == NULL){&lt;br /&gt;
			entry-&amp;gt;filename = dir_list[i]-&amp;gt;d_name;&lt;br /&gt;
			entry-&amp;gt;next = NULL;&lt;br /&gt;
			table[index] = entry;&lt;br /&gt;
		}&lt;br /&gt;
		else{&lt;br /&gt;
			entry-&amp;gt;filename = dir_list[i]-&amp;gt;d_name;&lt;br /&gt;
			entry-&amp;gt;next = table[index];&lt;br /&gt;
			table[index] = entry;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Compares two files */&lt;br /&gt;
int fcompare(const char *f1, const char *f2){&lt;br /&gt;
&lt;br /&gt;
	FILE *f, *g;&lt;br /&gt;
	int file1, file2;	&lt;br /&gt;
&lt;br /&gt;
	f = fopen(f1, &amp;quot;r&amp;quot;);&lt;br /&gt;
	g = fopen(f2, &amp;quot;r&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while(fread(&amp;amp;file1, sizeof(int), 1, f) &amp;amp;&amp;amp; fread(&amp;amp;file2, sizeof(int), 1, g)){&lt;br /&gt;
		if(file1!=file2){&lt;br /&gt;
			fclose(f);&lt;br /&gt;
			fclose(g);&lt;br /&gt;
			return 0;&lt;br /&gt;
 		}&lt;br /&gt;
	}&lt;br /&gt;
	fclose(f);&lt;br /&gt;
	fclose(g);&lt;br /&gt;
	return 1;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
/* This function scans the file table. If an entry contains more than one file,	*&lt;br /&gt;
 * it compares all them. If a duplicate is found, the first file is removed,  	*&lt;br /&gt;
 * and a hard link is created with the deleted file's name, pointing to the	*&lt;br /&gt;
 * second, identical, file.							*/&lt;br /&gt;
void deduplicate(){&lt;br /&gt;
&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;table_size; i++){&lt;br /&gt;
		while(table[i] != NULL &amp;amp;&amp;amp; table[i]-&amp;gt;next != NULL){&lt;br /&gt;
&lt;br /&gt;
			fileEntry *file1, *file2;&lt;br /&gt;
			file1 = table[i];&lt;br /&gt;
			file2 = table[i]-&amp;gt;next;&lt;br /&gt;
			while(file2 != NULL){&lt;br /&gt;
				if(fcompare(file1-&amp;gt;filename, file2-&amp;gt;filename)){&lt;br /&gt;
					unlink(file1-&amp;gt;filename);&lt;br /&gt;
					link(file2-&amp;gt;filename, file1-&amp;gt;filename);&lt;br /&gt;
					printf(&amp;quot;%s -&amp;gt; %s\n&amp;quot;, file1-&amp;gt;filename, file2-&amp;gt;filename);&lt;br /&gt;
					break;&lt;br /&gt;
				}&lt;br /&gt;
				file2 = file2-&amp;gt;next;&lt;br /&gt;
			}&lt;br /&gt;
			table[i] = table[i]-&amp;gt;next;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*selector function for scandir() */&lt;br /&gt;
int exclude(const struct dirent *dir){&lt;br /&gt;
&lt;br /&gt;
	if(dir-&amp;gt;d_type != DT_REG)&lt;br /&gt;
		return 0;&lt;br /&gt;
	else&lt;br /&gt;
		return 1;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
&lt;br /&gt;
	struct dirent **entries = NULL;&lt;br /&gt;
	int num_files;&lt;br /&gt;
&lt;br /&gt;
	num_files = scandir(&amp;quot;.&amp;quot;, &amp;amp;entries, exclude, alphasort);&lt;br /&gt;
&lt;br /&gt;
	populate_table(entries, num_files);&lt;br /&gt;
	deduplicate();&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=404</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=404"/>
		<updated>2014-03-04T23:50:21Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Decalogo di Programmazione Concorrente]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.09.13]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.07.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.05.29]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.01.25]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=398</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=398"/>
		<updated>2013-12-16T01:08:22Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;dirent.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;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
   if(access(entry[i]-&amp;gt;d_name, X_OK)==0){  //Check execution rights&lt;br /&gt;
     if((pid=fork())) ; //do nothing&lt;br /&gt;
     else&lt;br /&gt;
       execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&amp;lt;br&amp;gt;&lt;br /&gt;
edit: avevo dimenticato un pezzo.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Seconda parte dell'esercizio&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *	Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *	http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *	Es.2&lt;br /&gt;
 *	Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;dirent.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;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/wait.h&amp;gt;&lt;br /&gt;
#include &amp;lt;libgen.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;
/* Global variables&lt;br /&gt;
 * declaration&lt;br /&gt;
 */&lt;br /&gt;
const char *PROGRAM_NAME, *WORKING_DIR;&lt;br /&gt;
int b_flag, c_flag, p_flag;  //option flags&lt;br /&gt;
&lt;br /&gt;
/* Function&lt;br /&gt;
 * prototypes&lt;br /&gt;
 */&lt;br /&gt;
int selector(const struct dirent *file);&lt;br /&gt;
int checkbang(char *file_name);&lt;br /&gt;
void init(int argc, char **argv);&lt;br /&gt;
&lt;br /&gt;
/* Main function&lt;br /&gt;
 */&lt;br /&gt;
int main(int argc, char **argv){&lt;br /&gt;
	struct dirent **entry;&lt;br /&gt;
	int i, items, count=0;&lt;br /&gt;
	pid_t pid;&lt;br /&gt;
&lt;br /&gt;
	init(argc, argv);&lt;br /&gt;
&lt;br /&gt;
	items=scandir(WORKING_DIR, &amp;amp;entry, selector, alphasort);&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
		if((pid=fork())){&lt;br /&gt;
			if(!c_flag)&lt;br /&gt;
				count++;&lt;br /&gt;
			else{&lt;br /&gt;
				int status;&lt;br /&gt;
				waitpid(pid, &amp;amp;status, 0);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
 		else{&lt;br /&gt;
			execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
			exit(EXIT_FAILURE);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if(c_flag){&lt;br /&gt;
		for(i=0; i&amp;lt;count; i++){&lt;br /&gt;
			int status;&lt;br /&gt;
			wait(&amp;amp;status);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Check first two bytes of file for #!&lt;br /&gt;
 */&lt;br /&gt;
int checkbang(char *file_name){&lt;br /&gt;
	int fd;&lt;br /&gt;
	char bang[2];&lt;br /&gt;
&lt;br /&gt;
	fd=open(file_name, O_RDONLY);&lt;br /&gt;
	read(fd, bang, 2);&lt;br /&gt;
&lt;br /&gt;
	if((strncmp(bang, &amp;quot;#!&amp;quot;, 2)) == 0)&lt;br /&gt;
		return 1;&lt;br /&gt;
	else&lt;br /&gt;
		return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Initialize variables: program name(global const),&lt;br /&gt;
 * current directory, option flags&lt;br /&gt;
 */&lt;br /&gt;
void init(int argc, char **argv){&lt;br /&gt;
	int options;&lt;br /&gt;
&lt;br /&gt;
	while((options=getopt(argc, argv, &amp;quot;bcp&amp;quot;)) != -1 )&lt;br /&gt;
		switch(options){&lt;br /&gt;
			case 'b':&lt;br /&gt;
				b_flag=1;&lt;br /&gt;
				break;&lt;br /&gt;
			case 'c':&lt;br /&gt;
				c_flag=1;&lt;br /&gt;
				break;&lt;br /&gt;
			case 'p':&lt;br /&gt;
				p_flag=1;&lt;br /&gt;
				break;&lt;br /&gt;
			case '?':&lt;br /&gt;
				printf(&amp;quot;Invalid option: '%c'\n&amp;quot;, optopt);&lt;br /&gt;
				break;&lt;br /&gt;
			default:&lt;br /&gt;
				abort();&lt;br /&gt;
		}&lt;br /&gt;
	PROGRAM_NAME=basename(strdup(argv[0]));&lt;br /&gt;
&lt;br /&gt;
	//accept a target directory as an argument from command line&lt;br /&gt;
	if(optind==argc)&lt;br /&gt;
		WORKING_DIR=getcwd(NULL,0);&lt;br /&gt;
	else&lt;br /&gt;
		WORKING_DIR=argv[optind];&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*	Selector function, called by scandir. Selects files&lt;br /&gt;
 *	depending on command line options.&lt;br /&gt;
 *	Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int selector(const struct dirent *file){&lt;br /&gt;
	int i,j;&lt;br /&gt;
	char *filename;&lt;br /&gt;
&lt;br /&gt;
	filename=strdup(file-&amp;gt;d_name);&lt;br /&gt;
	//discard implied files&lt;br /&gt;
	if(strcmp(filename, &amp;quot;.&amp;quot;)==0 || strcmp(filename, &amp;quot;..&amp;quot;)==0)&lt;br /&gt;
		return 0;&lt;br /&gt;
&lt;br /&gt;
	//Check if file is executable&lt;br /&gt;
	if(!access(filename, X_OK)==0)&lt;br /&gt;
		return 0;&lt;br /&gt;
&lt;br /&gt;
	//prevent the program from running itself&lt;br /&gt;
	if(strcmp(filename, PROGRAM_NAME)==0)&lt;br /&gt;
		return 0;&lt;br /&gt;
&lt;br /&gt;
	//if flag is set check if program is a script&lt;br /&gt;
	if(b_flag &amp;amp;&amp;amp; !(checkbang(filename)))&lt;br /&gt;
		return 0;&lt;br /&gt;
&lt;br /&gt;
	//if flag is set, check if prog. name is palindrome&lt;br /&gt;
	if(p_flag){&lt;br /&gt;
	  for(i=0, j=strlen(filename)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
  	  if(filename[i]!=filename[j])&lt;br /&gt;
    	  return 0;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=394</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=394"/>
		<updated>2013-12-12T03:31:18Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;dirent.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;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
   if(access(entry[i]-&amp;gt;d_name, X_OK)==0){  //Check execution rights&lt;br /&gt;
     if((pid=fork())) ; //do nothing&lt;br /&gt;
     else&lt;br /&gt;
       execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&amp;lt;br&amp;gt;&lt;br /&gt;
edit: avevo dimenticato un pezzo.&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=393</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=393"/>
		<updated>2013-12-12T03:28:05Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;dirent.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;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
   if(access(entry[i]-&amp;gt;d_name, X_OK)==0){  //Check execution rights&lt;br /&gt;
     if((pid=fork())) ; //do nothing&lt;br /&gt;
     else&lt;br /&gt;
       execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
edit: avevo dimenticato un pezzo.&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=392</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=392"/>
		<updated>2013-12-12T02:24:24Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;dirent.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;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
    if((pid=fork())) ; //do nothing&lt;br /&gt;
    else&lt;br /&gt;
      execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=391</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=391"/>
		<updated>2013-12-12T02:21:17Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.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;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
    if((pid=fork())) ; //do nothing&lt;br /&gt;
    else&lt;br /&gt;
      execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=390</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=390"/>
		<updated>2013-12-12T02:20:25Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *  http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *  Es.1&lt;br /&gt;
 *  Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.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;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*  Selector function, called by scandir. Only selects&lt;br /&gt;
 *  palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
  //discard implied dirs&lt;br /&gt;
  if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
    return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
  struct dirent** entry;&lt;br /&gt;
  int i, items;&lt;br /&gt;
  pid_t pid;&lt;br /&gt;
&lt;br /&gt;
  items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
  for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
    int status;&lt;br /&gt;
    if((pid=fork())) ; //do nothing&lt;br /&gt;
    else&lt;br /&gt;
      execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=389</id>
		<title>ProvaPratica 2013.02.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.02.15&amp;diff=389"/>
		<updated>2013-12-12T02:17:17Z</updated>

		<summary type="html">&lt;p&gt;Edu san: Created page with &amp;quot;Esercizio 1 del 2013.02.15 &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; /*  *	Prova Pratica di Lab SO 2013.02.15  *	http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf  *	Es.1  *	Eduardo S...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1 del 2013.02.15&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *	Prova Pratica di Lab SO 2013.02.15&lt;br /&gt;
 *	http://www.cs.unibo.it/~renzo/so/pratiche/2013.02.15.pdf&lt;br /&gt;
 *	Es.1&lt;br /&gt;
 *	Eduardo Santarelli&lt;br /&gt;
 */&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.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;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*	Selector function, called by scandir. Only selects&lt;br /&gt;
 *	palindrome file names. Discards implied directories.&lt;br /&gt;
 */&lt;br /&gt;
int dir_is_pal(const struct dirent* dir){&lt;br /&gt;
  int i,j;&lt;br /&gt;
&lt;br /&gt;
	//discard implied dirs&lt;br /&gt;
	if(dir-&amp;gt;d_name[0]=='.' &amp;amp;&amp;amp; strlen(dir-&amp;gt;d_name)&amp;lt;3)&lt;br /&gt;
		return 0;&lt;br /&gt;
&lt;br /&gt;
  for(i=0, j=strlen(dir-&amp;gt;d_name)-1; i&amp;lt;j; i++, j--)&lt;br /&gt;
    if(dir-&amp;gt;d_name[i]!=dir-&amp;gt;d_name[j])&lt;br /&gt;
      return 0;&lt;br /&gt;
&lt;br /&gt;
  return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
	struct dirent** entry;&lt;br /&gt;
	int i, items;&lt;br /&gt;
	pid_t pid;&lt;br /&gt;
&lt;br /&gt;
	items=scandir(&amp;quot;./&amp;quot;, &amp;amp;entry, dir_is_pal, alphasort);&lt;br /&gt;
&lt;br /&gt;
	for(i=0; i&amp;lt;items; i++){&lt;br /&gt;
		int status;&lt;br /&gt;
	  if((pid=fork())) ; //do nothing&lt;br /&gt;
  	else&lt;br /&gt;
		execl(entry[i]-&amp;gt;d_name, entry[i]-&amp;gt;d_name, (char*)0);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Main_Page&amp;diff=388</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=388"/>
		<updated>2013-12-12T02:08:29Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Questo &amp;amp;egrave; il Wiki del Corso di Sistemi Operativi&lt;br /&gt;
&lt;br /&gt;
[[Esercizi a caso del Prof.]]&lt;br /&gt;
&lt;br /&gt;
[[Python Programma tieni punteggio.]]&lt;br /&gt;
&lt;br /&gt;
[[Comandi visti alle lezioni.]]&lt;br /&gt;
&lt;br /&gt;
[[SYS CALL viste a lezione.]]&lt;br /&gt;
&lt;br /&gt;
[[Parametri con getopt().]]&lt;br /&gt;
&lt;br /&gt;
[[Funzione con numero variabile di parametri.]]&lt;br /&gt;
&lt;br /&gt;
[[stampf - implementazione ridotta della printf.]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.07.18]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.06.21]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.05.29]]&lt;br /&gt;
&lt;br /&gt;
[[ProvaPratica 2013.02.15]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
Ricordate che per creare un account o quando viene richiesto di risolvere un semplice calcolo occorre ricordare quanto scritto [[qui]]&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=370</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=370"/>
		<updated>2013-11-28T01:37:47Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&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;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 3 in bash(Pirata &amp;amp; Fede):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*.* ; do&lt;br /&gt;
	somma=0&lt;br /&gt;
	ext=${f##*.}&lt;br /&gt;
	for file in *.&amp;quot;$ext&amp;quot;&lt;br /&gt;
	do&lt;br /&gt;
		somma=$(expr $somma + $(stat -c%s &amp;quot;$file&amp;quot;))&lt;br /&gt;
	done&lt;br /&gt;
	echo -n &amp;quot;size of file with extension &amp;quot;$ext&amp;quot; : &amp;quot;&lt;br /&gt;
	echo &amp;quot;$somma&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Per (Pirata &amp;amp; Fede) -Bash-: ci siamo quasi...però forse rifate gli stessi calcoli un po' di volte in più del necessario ;-) (am_20131127).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[Esercizio 3 in Python (ancora)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
#&lt;br /&gt;
# Prova Pratica di Lab SO 2013.05.29&lt;br /&gt;
# Es. 3&lt;br /&gt;
# Eduardo Santarelli&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
# return the suffix of file named fname, if present.&lt;br /&gt;
# return boolean value False otherwise&lt;br /&gt;
def get_suffix(fname):&lt;br /&gt;
	if '.' in fname:&lt;br /&gt;
		separator = fname.find('.')&lt;br /&gt;
		return fname[separator : ]&lt;br /&gt;
	else:&lt;br /&gt;
		return False	&lt;br /&gt;
&lt;br /&gt;
# Place a file in a dictionary. Each key corresponds&lt;br /&gt;
# to a specific suffix, its value is a list of all the&lt;br /&gt;
# file with that suffix&lt;br /&gt;
def build_dict(item, suffix):&lt;br /&gt;
	if suffix in all_files:&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
	else:&lt;br /&gt;
		all_files[suffix] = []&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
&lt;br /&gt;
# For each suffix key in the dictionary,&lt;br /&gt;
# calculates the total size of the files&lt;br /&gt;
# in the corresponding list&lt;br /&gt;
def size_of_entry(file_list):&lt;br /&gt;
		size = 0&lt;br /&gt;
		for item in file_list:&lt;br /&gt;
			size += os.path.getsize(item)&lt;br /&gt;
		return size&lt;br /&gt;
&lt;br /&gt;
# This dictionary will contain a key for each suffix,&lt;br /&gt;
# associated with a list of all the files ending with&lt;br /&gt;
# that suffix&lt;br /&gt;
all_files = dict()&lt;br /&gt;
&lt;br /&gt;
# Go to target directory and build a list containing all filenames&lt;br /&gt;
try:&lt;br /&gt;
	target_dir = sys.argv[1]&lt;br /&gt;
except:&lt;br /&gt;
	target_dir = '.'&lt;br /&gt;
os.chdir(target_dir)&lt;br /&gt;
dir_list = os.listdir('.')&lt;br /&gt;
&lt;br /&gt;
# For each file call get_suffix and then build_dict&lt;br /&gt;
# (unless get_suffix returns False)&lt;br /&gt;
for item in dir_list:&lt;br /&gt;
	suffix = get_suffix(item)&lt;br /&gt;
	if not suffix:&lt;br /&gt;
		pass&lt;br /&gt;
	else:&lt;br /&gt;
		build_dict(item, suffix)&lt;br /&gt;
&lt;br /&gt;
for key in all_files :&lt;br /&gt;
	print(&amp;quot;{0}: {1} Bytes&amp;quot;.format(key, size_of_entry(all_files[key])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
--edit: dir_list = os.listdir(target_dir) non funzionava bene coi path relativi.&lt;br /&gt;
Ora os.listdir('.') dovrebbe andare bene.&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=369</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=369"/>
		<updated>2013-11-28T01:37:22Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&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;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 3 in bash(Pirata &amp;amp; Fede):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*.* ; do&lt;br /&gt;
	somma=0&lt;br /&gt;
	ext=${f##*.}&lt;br /&gt;
	for file in *.&amp;quot;$ext&amp;quot;&lt;br /&gt;
	do&lt;br /&gt;
		somma=$(expr $somma + $(stat -c%s &amp;quot;$file&amp;quot;))&lt;br /&gt;
	done&lt;br /&gt;
	echo -n &amp;quot;size of file with extension &amp;quot;$ext&amp;quot; : &amp;quot;&lt;br /&gt;
	echo &amp;quot;$somma&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Per (Pirata &amp;amp; Fede) -Bash-: ci siamo quasi...però forse rifate gli stessi calcoli un po' di volte in più del necessario ;-) (am_20131127).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[Esercizio 3 in Python (ancora)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
#&lt;br /&gt;
# Prova Pratica di Lab SO 2013.05.29&lt;br /&gt;
# Es. 3&lt;br /&gt;
# Eduardo Santarelli&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
# return the suffix of file named fname, if present.&lt;br /&gt;
# return boolean value False otherwise&lt;br /&gt;
def get_suffix(fname):&lt;br /&gt;
	if '.' in fname:&lt;br /&gt;
		separator = fname.find('.')&lt;br /&gt;
		return fname[separator : ]&lt;br /&gt;
	else:&lt;br /&gt;
		return False	&lt;br /&gt;
&lt;br /&gt;
# Place a file in a dictionary. Each key corresponds&lt;br /&gt;
# to a specific suffix, its value is a list of all the&lt;br /&gt;
# file with that suffix&lt;br /&gt;
def build_dict(item, suffix):&lt;br /&gt;
	if suffix in all_files:&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
	else:&lt;br /&gt;
		all_files[suffix] = []&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
&lt;br /&gt;
# For each suffix key in the dictionary,&lt;br /&gt;
# calculates the total size of the files&lt;br /&gt;
# in the corresponding list&lt;br /&gt;
def size_of_entry(file_list):&lt;br /&gt;
		size = 0&lt;br /&gt;
		for item in file_list:&lt;br /&gt;
			size += os.path.getsize(item)&lt;br /&gt;
		return size&lt;br /&gt;
&lt;br /&gt;
# This dictionary will contain a key for each suffix,&lt;br /&gt;
# associated with a list of all the files ending with&lt;br /&gt;
# that suffix&lt;br /&gt;
all_files = dict()&lt;br /&gt;
&lt;br /&gt;
# Go to target directory and build a list containing all filenames&lt;br /&gt;
try:&lt;br /&gt;
	target_dir = sys.argv[1]&lt;br /&gt;
except:&lt;br /&gt;
	target_dir = '.'&lt;br /&gt;
os.chdir(target_dir)&lt;br /&gt;
dir_list = os.listdir('.')&lt;br /&gt;
&lt;br /&gt;
# For each file call get_suffix and then build_dict&lt;br /&gt;
# (unless get_suffix returns False)&lt;br /&gt;
for item in dir_list:&lt;br /&gt;
	suffix = get_suffix(item)&lt;br /&gt;
	if not suffix:&lt;br /&gt;
		pass&lt;br /&gt;
	else:&lt;br /&gt;
		build_dict(item, suffix)&lt;br /&gt;
&lt;br /&gt;
for key in all_files :&lt;br /&gt;
	print(&amp;quot;{0}: {1} Bytes&amp;quot;.format(key, size_of_entry(all_files[key])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;br /&gt;
edit: dir_list = os.listdir(target_dir) non funzionava bene coi path relativi.&lt;br /&gt;
Ora os.listdir('.') dovrebbe andare bene.&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=368</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=368"/>
		<updated>2013-11-28T01:29:49Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&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;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 3 in bash(Pirata &amp;amp; Fede):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*.* ; do&lt;br /&gt;
	somma=0&lt;br /&gt;
	ext=${f##*.}&lt;br /&gt;
	for file in *.&amp;quot;$ext&amp;quot;&lt;br /&gt;
	do&lt;br /&gt;
		somma=$(expr $somma + $(stat -c%s &amp;quot;$file&amp;quot;))&lt;br /&gt;
	done&lt;br /&gt;
	echo -n &amp;quot;size of file with extension &amp;quot;$ext&amp;quot; : &amp;quot;&lt;br /&gt;
	echo &amp;quot;$somma&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Per (Pirata &amp;amp; Fede) -Bash-: ci siamo quasi...però forse rifate gli stessi calcoli un po' di volte in più del necessario ;-) (am_20131127).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
[Esercizio 3 in Python (ancora)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
#&lt;br /&gt;
# Prova Pratica di Lab SO 2013.05.29&lt;br /&gt;
# Es. 3&lt;br /&gt;
# Eduardo Santarelli&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
# return the suffix of file named fname, if present.&lt;br /&gt;
# return boolean value False otherwise&lt;br /&gt;
def get_suffix(fname):&lt;br /&gt;
	if '.' in fname:&lt;br /&gt;
		separator = fname.find('.')&lt;br /&gt;
		return fname[separator : ]&lt;br /&gt;
	else:&lt;br /&gt;
		return False	&lt;br /&gt;
&lt;br /&gt;
# Place a file in a dictionary. Each key corresponds&lt;br /&gt;
# to a specific suffix, its value is a list of all the&lt;br /&gt;
# file with that suffix&lt;br /&gt;
def build_dict(item, suffix):&lt;br /&gt;
	if suffix in all_files:&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
	else:&lt;br /&gt;
		all_files[suffix] = []&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
&lt;br /&gt;
# For each suffix key in the dictionary,&lt;br /&gt;
# calculates the total size of the files&lt;br /&gt;
# in the corresponding list&lt;br /&gt;
def size_of_entry(file_list):&lt;br /&gt;
		size = 0&lt;br /&gt;
		for item in file_list:&lt;br /&gt;
			size += os.path.getsize(item)&lt;br /&gt;
		return size&lt;br /&gt;
&lt;br /&gt;
# This dictionary will contain a key for each suffix,&lt;br /&gt;
# associated with a list of all the files ending with&lt;br /&gt;
# that suffix&lt;br /&gt;
all_files = dict()&lt;br /&gt;
&lt;br /&gt;
# Go to target directory and build a list containing all filenames&lt;br /&gt;
try:&lt;br /&gt;
	target_dir = sys.argv[1]&lt;br /&gt;
except:&lt;br /&gt;
	target_dir = '.'&lt;br /&gt;
os.chdir(target_dir)&lt;br /&gt;
dir_list = os.listdir(target_dir)&lt;br /&gt;
&lt;br /&gt;
# For each file call get_suffix and then build_dict&lt;br /&gt;
# (unless get_suffix returns False)&lt;br /&gt;
for item in dir_list:&lt;br /&gt;
	suffix = get_suffix(item)&lt;br /&gt;
	if not suffix:&lt;br /&gt;
		pass&lt;br /&gt;
	else:&lt;br /&gt;
		build_dict(item, suffix)&lt;br /&gt;
&lt;br /&gt;
for key in all_files :&lt;br /&gt;
	print(&amp;quot;{0}: {1} Bytes&amp;quot;.format(key, size_of_entry(all_files[key])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=367</id>
		<title>ProvaPratica 2013.05.29</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2013.05.29&amp;diff=367"/>
		<updated>2013-11-28T01:14:06Z</updated>

		<summary type="html">&lt;p&gt;Edu san: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[Python 3]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
'''&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
29 maggio 2013&lt;br /&gt;
Esercizio 3&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2013.05.29.pdf&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
'''&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
def Main(argv):&lt;br /&gt;
    # Check number of arguments&lt;br /&gt;
    if len(argv) != 2:&lt;br /&gt;
        print(&amp;quot;The function requires one argument to be passed in.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Check parameters&lt;br /&gt;
    topDir = str(sys.argv[1])&lt;br /&gt;
    if not os.path.isdir(topDir):&lt;br /&gt;
        print(&amp;quot;The parameter should be an existing directory.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Build a dictionary with key-value pair {file extension - total size}&lt;br /&gt;
    extensionSize = { }&lt;br /&gt;
    GetSize(topDir, extensionSize)&lt;br /&gt;
    &lt;br /&gt;
    # Print results&lt;br /&gt;
    PrintResults(extensionSize)&lt;br /&gt;
&lt;br /&gt;
def GetSize(topDir, extensionSize):&lt;br /&gt;
    for dirPath, dirNames, files in os.walk(topDir):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            # 'example.mp3' -&amp;gt; ['example', 'mp3']&lt;br /&gt;
            # 'example.tar.gz' -&amp;gt; ['example', 'tar', 'gz']&lt;br /&gt;
            parts = file.split('.')&lt;br /&gt;
            # ['example', 'mp3'] -&amp;gt; ['mp3']&lt;br /&gt;
            # ['example', 'tar', 'gz'] -&amp;gt; ['tar', 'gz']&lt;br /&gt;
            parts = parts[1:]&lt;br /&gt;
            # ['mp3'] -&amp;gt; '.mp3'&lt;br /&gt;
            # ['tar', 'gz'] -&amp;gt; '.tar.gz'&lt;br /&gt;
            fileExtension = &amp;quot;.{0}&amp;quot;.format(&amp;quot;.&amp;quot;.join(str(part) for part in parts))&lt;br /&gt;
            &lt;br /&gt;
            # Compute the size in Bytes and update the dictionary&lt;br /&gt;
            filePath = os.path.join(dirPath, file)   &lt;br /&gt;
            fileSize = os.path.getsize(filePath)&lt;br /&gt;
            extensionSize[fileExtension] = extensionSize.get(fileExtension, 0) + fileSize&lt;br /&gt;
&lt;br /&gt;
# Print results&lt;br /&gt;
def PrintResults(extensionSize):&lt;br /&gt;
    for key, value in sorted(extensionSize.items()):&lt;br /&gt;
        print('{0}: {1} Bytes.'.format(key, value))&lt;br /&gt;
        &lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    sys.exit(Main(sys.argv))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
mia versione&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
import os, sys, copy&lt;br /&gt;
&lt;br /&gt;
def dotsubstr(a):#restituisce la sottostringa .suffisso&lt;br /&gt;
	#fcd = os.listdir('{0}'.format(arg1))&lt;br /&gt;
	i=0&lt;br /&gt;
	try:&lt;br /&gt;
		while a[i]!='.':&lt;br /&gt;
			i=i+1&lt;br /&gt;
		return a[i:]&lt;br /&gt;
	except IndexError:&lt;br /&gt;
		return -1&lt;br /&gt;
&lt;br /&gt;
def compliarg(li,arg):#restituisce una lista di tutti gli elementi contenenti la sottostringa arg come suffisso&lt;br /&gt;
	res=[]&lt;br /&gt;
	while li != []:&lt;br /&gt;
		a=li.pop()&lt;br /&gt;
		if a.endswith(arg): res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listremintsect(l2,l1):#restituisce una lista res = l1 - intersezione di l1 ed l2&lt;br /&gt;
	res=[]&lt;br /&gt;
	while l1 != []:&lt;br /&gt;
		a=l1.pop()&lt;br /&gt;
		if not a in l2: res.append(a)&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def createpathlist(c,path):#restituisce una lista di path 'path' relativi ai file contenuti in c.&lt;br /&gt;
	res = []&lt;br /&gt;
	while c != []:&lt;br /&gt;
		res.append('{0}/{1}'.format(path,c.pop()))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def totsizes(d): #data una lista d di path restituisce la somma di tutti i size di d&lt;br /&gt;
	res = 0&lt;br /&gt;
	while d != []:&lt;br /&gt;
		a = d.pop()&lt;br /&gt;
		if os.path.isfile('{0}'.format(a)):&lt;br /&gt;
			res = res + os.path.getsize('{0}'.format(a))&lt;br /&gt;
	return res&lt;br /&gt;
&lt;br /&gt;
def listsubstr(arg): #ritorna un dizionario del tipo diz[str(suffisso)] = int(size relativo al suffisso)&lt;br /&gt;
	res = {}&lt;br /&gt;
	fcd = os.listdir('{0}'.format(arg))&lt;br /&gt;
	while fcd != []:&lt;br /&gt;
		fcdtmp=copy.deepcopy(fcd) #BUGGONE SENZA COPY!!!!!!&lt;br /&gt;
		a = fcd.pop()&lt;br /&gt;
		b = dotsubstr(a)&lt;br /&gt;
		if b == -1: continue&lt;br /&gt;
		else: pass&lt;br /&gt;
		c = compliarg(fcdtmp,b)&lt;br /&gt;
		s=copy.deepcopy(c) #!!!!!!!!!!!!!!!!!!!!!!!!!&lt;br /&gt;
		d = createpathlist(c,arg)&lt;br /&gt;
		res[b] = totsizes(d)&lt;br /&gt;
&lt;br /&gt;
		fcd = listremintsect(s,fcd)&lt;br /&gt;
&lt;br /&gt;
	return res&lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
try:&lt;br /&gt;
	res = listsubstr(sys.argv[1])&lt;br /&gt;
	a=list(res.keys())&lt;br /&gt;
	while a != []:&lt;br /&gt;
		b = a.pop()&lt;br /&gt;
		print('{0}:\t{1}'.format(b,res[b]))&lt;br /&gt;
except OSError:&lt;br /&gt;
	print(&amp;quot;Could not solve path&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-fede&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Esercizio 1: Linguaggio C&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/eventfd.h&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;
&lt;br /&gt;
#define BUFFSIZE 10&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	int efd,n,i;&lt;br /&gt;
	char buf1[BUFFSIZE];&lt;br /&gt;
	char buf2[BUFFSIZE];&lt;br /&gt;
	&lt;br /&gt;
	do{&lt;br /&gt;
		efd = eventfd(0,0);&lt;br /&gt;
	}while(efd&amp;lt;0);&lt;br /&gt;
	&lt;br /&gt;
	while(1){&lt;br /&gt;
		if(fork()){ /*padre*/&lt;br /&gt;
				read(0,buf1,sizeof(buf1)); /*0 indica lo standard input*/&lt;br /&gt;
				write(efd, buf1, sizeof(buf1));&lt;br /&gt;
				}&lt;br /&gt;
			&lt;br /&gt;
		else{ /*figlio*/&lt;br /&gt;
			read(efd, buf2, sizeof(buf2));&lt;br /&gt;
			n=atoi(buf2);&lt;br /&gt;
			for(i=0; i&amp;lt;n; i++) printf(&amp;quot;x\n&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN. con grande aiuto da parte dei colleghi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esercizio 3 in bash(Pirata &amp;amp; Fede):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
for f in &amp;quot;$1&amp;quot;/*.* ; do&lt;br /&gt;
	somma=0&lt;br /&gt;
	ext=${f##*.}&lt;br /&gt;
	for file in *.&amp;quot;$ext&amp;quot;&lt;br /&gt;
	do&lt;br /&gt;
		somma=$(expr $somma + $(stat -c%s &amp;quot;$file&amp;quot;))&lt;br /&gt;
	done&lt;br /&gt;
	echo -n &amp;quot;size of file with extension &amp;quot;$ext&amp;quot; : &amp;quot;&lt;br /&gt;
	echo &amp;quot;$somma&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Per (Pirata &amp;amp; Fede) -Bash-: ci siamo quasi...però forse rifate gli stessi calcoli un po' di volte in più del necessario ;-) (am_20131127).&lt;br /&gt;
&lt;br /&gt;
[Esercizio 3 in Python (ancora)]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
#&lt;br /&gt;
# Prova Pratica di Lab SO 2013.05.29&lt;br /&gt;
# Es. 3&lt;br /&gt;
# Eduardo Santarelli&lt;br /&gt;
#####################################&lt;br /&gt;
&lt;br /&gt;
import os, sys&lt;br /&gt;
&lt;br /&gt;
# return the suffix of file named fname, if present.&lt;br /&gt;
# return boolean value False otherwise&lt;br /&gt;
def get_suffix(fname):&lt;br /&gt;
	if '.' in fname:&lt;br /&gt;
		separator = fname.find('.')&lt;br /&gt;
		return fname[separator : ]&lt;br /&gt;
	else:&lt;br /&gt;
		return False	&lt;br /&gt;
&lt;br /&gt;
# Place a file in a dictionary. Each key corresponds&lt;br /&gt;
# to a specific suffix, its value is a list of all the&lt;br /&gt;
# file with that suffix&lt;br /&gt;
def build_dict(item, suffix):&lt;br /&gt;
	if suffix in all_files:&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
	else:&lt;br /&gt;
		all_files[suffix] = []&lt;br /&gt;
		all_files[suffix].append(item)&lt;br /&gt;
&lt;br /&gt;
# For each suffix key in the dictionary,&lt;br /&gt;
# calculates the total size of the files&lt;br /&gt;
# in the corresponding list&lt;br /&gt;
def size_of_entry(file_list):&lt;br /&gt;
		size = 0&lt;br /&gt;
		for item in file_list:&lt;br /&gt;
			size += os.path.getsize(item)&lt;br /&gt;
		return size&lt;br /&gt;
&lt;br /&gt;
# This dictionary will contain a key for each suffix,&lt;br /&gt;
# associated with a list of all the files ending with&lt;br /&gt;
# that suffix&lt;br /&gt;
all_files = dict()&lt;br /&gt;
&lt;br /&gt;
# Go to target directory and build a list containing all filenames&lt;br /&gt;
try:&lt;br /&gt;
	target_dir = sys.argv[1]&lt;br /&gt;
except:&lt;br /&gt;
	target_dir = '.'&lt;br /&gt;
os.chdir(target_dir)&lt;br /&gt;
dir_list = os.listdir(target_dir)&lt;br /&gt;
&lt;br /&gt;
# For each file call get_suffix and then build_dict&lt;br /&gt;
# (unless get_suffix returns False)&lt;br /&gt;
for item in dir_list:&lt;br /&gt;
	suffix = get_suffix(item)&lt;br /&gt;
	if not suffix:&lt;br /&gt;
		pass&lt;br /&gt;
	else:&lt;br /&gt;
		build_dict(item, suffix)&lt;br /&gt;
&lt;br /&gt;
for key in all_files :&lt;br /&gt;
	print(&amp;quot;{0}: {1} Bytes&amp;quot;.format(key, size_of_entry(all_files[key])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Eduardo&lt;/div&gt;</summary>
		<author><name>Edu san</name></author>
	</entry>
</feed>