<?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=Mrta</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=Mrta"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/Mrta"/>
	<updated>2026-05-13T23:45:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.05.30&amp;diff=741</id>
		<title>ProvaTeorica 2013.05.30</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2013.05.30&amp;diff=741"/>
		<updated>2014-05-19T15:29:40Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;[http://www.cs.unibo.it/~renzo/so/compiti/2013.05.30.tot.pdf Testo del compito]&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.1&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; &amp;lt;b&amp;gt;PUNTO A:&amp;lt;/b&amp;gt; (7+256+(256^2)+(256^3))*1kb =16.843.015kb quindi approssimativamente 16MB&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; &amp;lt;b&amp;gt; PUNTO B:&amp;lt;/B&amp;gt; blocco indiretto triplo -&amp;gt; primo livello di idirizzamento 256 esimo blocco -&amp;gt; secondo livello di indirizzamento 256 esimo blocco -&amp;gt; terzo livello di indirizzamento al blocco 100000. Qundi in totale 4 blocchi &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt; Esercizio g.2 &amp;lt;/h2&amp;gt;&lt;br /&gt;
[[File:Holt.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor eventp&lt;br /&gt;
{&lt;br /&gt;
	typedef struct EP &lt;br /&gt;
	{&lt;br /&gt;
		unsigned int value;	&lt;br /&gt;
		condition okNotNull;&lt;br /&gt;
		condition okToAdd;&lt;br /&gt;
		intqueue q;&lt;br /&gt;
		}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry EP* create(unsigned value)&lt;br /&gt;
{&lt;br /&gt;
	EP *ep = new EP(value);&lt;br /&gt;
	eps.enqueu(ep);&lt;br /&gt;
	return ep;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry write(EP *d,unsigned value)&lt;br /&gt;
{&lt;br /&gt;
	if(d.value+value &amp;gt; d.value.size()|| !d.q.empty()) {&lt;br /&gt;
		d.q.enqueue(value);&lt;br /&gt;
		d.okToAdd.wait();&lt;br /&gt;
		d.q.dequeue();&lt;br /&gt;
	}&lt;br /&gt;
	d.value = d.value + value;&lt;br /&gt;
	if (d.q.top()+value &amp;lt;= d.value.size())&lt;br /&gt;
		d.okToAdd.signal();&lt;br /&gt;
	else&lt;br /&gt;
		d.okNotNull.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// MAXINT - currentvalue &amp;lt; value &lt;br /&gt;
procedure entry unsigned int read(EP *ep)&lt;br /&gt;
{&lt;br /&gt;
	if(!ep.value)&lt;br /&gt;
		ep.okNotNull.wait();&lt;br /&gt;
	unsigned int toReturn = ep.value;&lt;br /&gt;
	ep.value = 0;&lt;br /&gt;
	ep.okToAdd.signal();&lt;br /&gt;
	return toReturn;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2009.01.14&amp;diff=740</id>
		<title>Prova Teorica 2009.01.14</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=Prova_Teorica_2009.01.14&amp;diff=740"/>
		<updated>2014-05-19T14:58:06Z</updated>

		<summary type="html">&lt;p&gt;Mrta: Created page with &amp;quot;Esercizio 1: Scrivere un monitor che implementi un buffer limitato (SIZE elementi) dove i messaggi abbiano associata una priorita'. I processi produttori richiamano pbb.enqueu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Esercizio 1: Scrivere un monitor che implementi un buffer limitato (SIZE elementi) dove&lt;br /&gt;
i messaggi abbiano associata una priorita'. I processi produttori richiamano&lt;br /&gt;
pbb.enqueue(m,prio)&lt;br /&gt;
mentre i processi consumatori chiamano&lt;br /&gt;
m=pbb.dequeue()&lt;br /&gt;
I primi SIZE processi produttori pongono i loro elementi nel buffer senza bloccarsi, i successivi si fermano in attesa.&lt;br /&gt;
Il consumatore deve sempre prendere l'elemento a priorita' massima fra quelli nel buffer *e* fra quelli in attesa.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
struct el {&lt;br /&gt;
  int prio;&lt;br /&gt;
  condition c;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct bufel {&lt;br /&gt;
  T payload;&lt;br /&gt;
  struct el prioc;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct bufel buf[SIZE+1];&lt;br /&gt;
int nbuf, nqueue;&lt;br /&gt;
condition oktoread;&lt;br /&gt;
&lt;br /&gt;
procedure entry void enqueue(T m, int prio) {&lt;br /&gt;
  if(nbuf&amp;gt;=SIZE) {&lt;br /&gt;
    el=new(struct el); el.prio=prio;&lt;br /&gt;
    nqueue++; q.enqueue(el); nqueue--;&lt;br /&gt;
    free(el);&lt;br /&gt;
  }&lt;br /&gt;
  buf[nbuf].prio=prio; buf[nbuf].payload=m;&lt;br /&gt;
  nbuf++;&lt;br /&gt;
  sort(buf, nbuf); //in ordine crescente&lt;br /&gt;
  oktoread.signal();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
procedure entry dequeu(void) {&lt;br /&gt;
  if(nbuf+nqueue==0)&lt;br /&gt;
    oktoread.wait()&lt;br /&gt;
  if(nqueue&amp;gt;0) {&lt;br /&gt;
    el=q.dequeue();  //quello a prio max&lt;br /&gt;
    el.c.signal();&lt;br /&gt;
  }&lt;br /&gt;
  nbuf--;&lt;br /&gt;
  return nuf[nbuf].payload;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.07.17&amp;diff=739</id>
		<title>ProvaPratica 2012.07.17</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2012.07.17&amp;diff=739"/>
		<updated>2014-05-19T14:09:35Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;syntaxhighlight lang = &amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.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;string.h&amp;gt;&lt;br /&gt;
#define BUF_SIZE 20&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
	int ncopie, i, ris;&lt;br /&gt;
	char command[BUF_SIZE];&lt;br /&gt;
	if (argc&amp;lt;3) {printf(&amp;quot;inserisci due o più argomenti (ncopie, command)\n&amp;quot;); exit(1);}&lt;br /&gt;
	ncopie = atoi(argv[1]);&lt;br /&gt;
	strcpy(command, argv[2]);&lt;br /&gt;
	for (i = 0; i&amp;lt;ncopie; i++){&lt;br /&gt;
		if(fork()){//processo padre&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			char *env_el;&lt;br /&gt;
			env_el = malloc(BUF_SIZE);&lt;br /&gt;
			sprintf(env_el, &amp;quot;NCOPIA=%d&amp;quot;, i);&lt;br /&gt;
			//asprintf &lt;br /&gt;
			//devo aggiungerci in fondo lo zero terminatore&lt;br /&gt;
			char *newenviron[] = {env_el, (char*) 0};&lt;br /&gt;
			//argv+2 sono gli argomenti, ovvero tutti gli argomenti passati dopo il secondo			&lt;br /&gt;
			ris = execve(argv[2], argv+2, newenviron);&lt;br /&gt;
			if (ris == -1) {perror(&amp;quot;execve&amp;quot;); exit(1);}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	for (i = 0; i&amp;lt;ncopie; i++) wait(NULL);&lt;br /&gt;
	return 1;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
(In realtà non funziona bene, di fatto un processo fa quello che dovrebbe fare e gli altri danno bad address, se trovate l'errore correggetelo e scrivete qua sotto cosa avete cambiato e perché)&lt;br /&gt;
&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;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#define BUF_SIZE 20&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char** argv){&lt;br /&gt;
				int ncopie, i, ris;&lt;br /&gt;
				char command[BUF_SIZE];&lt;br /&gt;
				if (argc&amp;lt;3) {printf(&amp;quot;inserisci due argomenti (ncopie, command)\n&amp;quot;); exit(1);}&lt;br /&gt;
				ncopie = atoi(argv[1]);&lt;br /&gt;
				int fd[ncopie];&lt;br /&gt;
				pid_t pid[ncopie];&lt;br /&gt;
				for (i = 0; i&amp;lt;ncopie; i++){&lt;br /&gt;
								char *tmpfile;&lt;br /&gt;
								asprintf(&amp;amp;tmpfile,&amp;quot;/tmp/ncopie.%d.%d&amp;quot;,getpid(),i);&lt;br /&gt;
								fd[i]=open(tmpfile,O_CREAT|O_RDWR,0600);&lt;br /&gt;
								unlink(tmpfile);&lt;br /&gt;
								if((pid[i]=fork())==0){//processo padre&lt;br /&gt;
												char *NCOPIA;&lt;br /&gt;
												asprintf(&amp;amp;NCOPIA, &amp;quot;NCOPIA=%d&amp;quot;, i); &lt;br /&gt;
												char *newenviron[] = { NCOPIA, (void *)0};	&lt;br /&gt;
												dup2(fd[i],STDOUT_FILENO);&lt;br /&gt;
												ris = execve(argv[2], argv+2, newenviron);&lt;br /&gt;
												if (ris == -1) {perror(&amp;quot;execve&amp;quot;); exit(1);}&lt;br /&gt;
								}&lt;br /&gt;
				}&lt;br /&gt;
				for (i = 0; i&amp;lt;ncopie; i++) {&lt;br /&gt;
								waitpid(pid[i],NULL,0);&lt;br /&gt;
								lseek(fd[i],SEEK_SET,0);&lt;br /&gt;
								char *buf[1024];&lt;br /&gt;
								int n;&lt;br /&gt;
								while ((n=read(fd[i],buf,1024))&amp;gt;0)&lt;br /&gt;
												write(STDOUT_FILENO,buf,n);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2014.01.23&amp;diff=647</id>
		<title>ProvaPratica 2014.01.23</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2014.01.23&amp;diff=647"/>
		<updated>2014-04-30T14:53:51Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[C esercizi 1 e 2]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*Esercizio 1: Linguaggio C (obbligatorio): (20 punti)&lt;br /&gt;
*Scrivere un programma in C “linean” che prenda come parametro il pathname di un file e un numero intero (che chiameremo n). &lt;br /&gt;
*Il programma deve stampare come output il numero di caratteri presenti nella n-ma riga del file se il file e' un file regolare di testo, non deve stampare nulla negli altri casi.&lt;br /&gt;
*Un file viene considerato di testo se tutti i suoi byte hanno valori compresi nel range 1-127.&lt;br /&gt;
*Per controllare se il file e' “regolare” usare la system call lstat&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 200&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int istextfile( FILE *fd ){                                   //check if the file is a regular file of text,it means that every byte has a value between 1-127&lt;br /&gt;
	int c;&lt;br /&gt;
	while ( (c = getc ( fd ) ) != EOF &amp;amp;&amp;amp; c &amp;lt;= 127 );&lt;br /&gt;
	rewind(fd);                                           //sets the file's cursor at the beginning,otherwise the linean program cannot find the line&lt;br /&gt;
	return ( (c == EOF)? 1 : 0 );&lt;br /&gt;
}&lt;br /&gt;
	 &lt;br /&gt;
		&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void linean( char *path , int line ){&lt;br /&gt;
	FILE *fd;&lt;br /&gt;
	struct stat buf;&lt;br /&gt;
	char bufline[BUFFSIZE];&lt;br /&gt;
	char *res;&lt;br /&gt;
	int n = line;&lt;br /&gt;
	res = NULL;&lt;br /&gt;
	lstat( path , &amp;amp;buf );&lt;br /&gt;
	if ( S_ISREG( buf.st_mode ) )&lt;br /&gt;
	{&lt;br /&gt;
		fd = fopen( path , &amp;quot;r&amp;quot; );&lt;br /&gt;
		if ( fd == NULL )&lt;br /&gt;
		{&lt;br /&gt;
			perror( &amp;quot;Error to open the file\n&amp;quot; );&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
			if ( istextfile( fd ) )&lt;br /&gt;
			{&lt;br /&gt;
				while ( ( line &amp;gt; 0 ) )                                        //iterates until at the nline and when is reached then checks if the buffer contains something&lt;br /&gt;
				{&lt;br /&gt;
					res = fgets(bufline, BUFFSIZE , fd );    //every time the nline is buffered,when exits from the cicle, the buffer contains the nline &lt;br /&gt;
					line--;&lt;br /&gt;
				}&lt;br /&gt;
				if ( res != NULL )                &lt;br /&gt;
				{&lt;br /&gt;
					printf( &amp;quot;The file %s in line %d has : %d char\n&amp;quot; , path , n , ( strlen( bufline ) - 1 )  );  //strlen also consider the carriage return&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				printf( &amp;quot;Error: isn't possible to find the line\n&amp;quot; );&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
				printf( &amp;quot;Error is not a regular file of text\n&amp;quot; );&lt;br /&gt;
				&lt;br /&gt;
		fclose(fd);&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		printf( &amp;quot;The file %s isn't a regular file\n&amp;quot; , path );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
int main( int argc , char *argv[] ){&lt;br /&gt;
	int n = atoi( argv[2] );&lt;br /&gt;
	linean( argv[1] , n );&lt;br /&gt;
	return(0);&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
*Esercizio 2: completamento (10 punti)&lt;br /&gt;
*Si scriva un programma C chiamato “lineandir”. Il risultato del programma, stampato su standard output, deve essere un solo&lt;br /&gt;
*numero intero: la somma del numero di caratteri presenti nelle n-me righe di tutti i file regolari, di testo, non nascosti (il primo&lt;br /&gt;
*carattere deve essere diverso da punto) della directory corrente. &lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.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;
&lt;br /&gt;
&lt;br /&gt;
#define BUFFSIZE 200&lt;br /&gt;
&lt;br /&gt;
int istextfile( FILE *fd );&lt;br /&gt;
int linean( char *path , int line );&lt;br /&gt;
void lineandir( char *dir , int line );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void lineandir( char *dir , int line ){&lt;br /&gt;
	int count , i;&lt;br /&gt;
	int sumline;&lt;br /&gt;
	struct dirent **de;&lt;br /&gt;
	sumline = 0;&lt;br /&gt;
	count = scandir( dir , &amp;amp;de , NULL , alphasort );&lt;br /&gt;
	for ( i = 0 ; i &amp;lt; count ; i++ )&lt;br /&gt;
	{&lt;br /&gt;
		if ( de[i]-&amp;gt;d_name[0] != '.' )     //doesn't consider the hidden files&lt;br /&gt;
			sumline = sumline + linean( de[i]-&amp;gt;d_name , line );&lt;br /&gt;
		free(de[i]);&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot;The sum of char for every regular text file's nline in the current directory is: %d\n&amp;quot; , sumline );&lt;br /&gt;
	free(de);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int istextfile( FILE *fd ){                                  &lt;br /&gt;
	int c;&lt;br /&gt;
	while ( (c = getc ( fd ) ) != EOF &amp;amp;&amp;amp; c &amp;lt;= 127 );&lt;br /&gt;
	rewind(fd);                                           &lt;br /&gt;
	return ( (c == EOF)? 1 : 0 );&lt;br /&gt;
}&lt;br /&gt;
	 &lt;br /&gt;
		&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*linean is modified so it can return the value of the char in the nline */&lt;br /&gt;
int linean( char *path , int line ){&lt;br /&gt;
	FILE *fd;&lt;br /&gt;
	struct stat buf;&lt;br /&gt;
	char bufline[BUFFSIZE];&lt;br /&gt;
	char *res;&lt;br /&gt;
	int n = line;&lt;br /&gt;
	res = NULL;&lt;br /&gt;
	lstat( path , &amp;amp;buf );&lt;br /&gt;
	if ( S_ISREG( buf.st_mode ) )&lt;br /&gt;
	{&lt;br /&gt;
		fd = fopen( path , &amp;quot;r&amp;quot; );&lt;br /&gt;
		if ( fd == NULL )&lt;br /&gt;
		{&lt;br /&gt;
			perror( &amp;quot;Error to open the file\n&amp;quot; );&lt;br /&gt;
			exit(1);&lt;br /&gt;
		}&lt;br /&gt;
			if ( istextfile( fd ) )&lt;br /&gt;
			{&lt;br /&gt;
				while ( ( line &amp;gt; 0 ) )                                        &lt;br /&gt;
				{&lt;br /&gt;
					res = fgets(bufline, BUFFSIZE , fd );    &lt;br /&gt;
					line--;&lt;br /&gt;
				}&lt;br /&gt;
				if ( res != NULL )                &lt;br /&gt;
				{&lt;br /&gt;
					return( ( strlen( bufline ) - 1 )  );  &lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
				printf( &amp;quot;Error: isn't possible to find the line\n&amp;quot; );&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
				printf( &amp;quot;Error is not a regular file of text\n&amp;quot; );&lt;br /&gt;
				&lt;br /&gt;
		fclose(fd);&lt;br /&gt;
				&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
		printf( &amp;quot;The file %s isn't a regular file\n&amp;quot; , path );&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
int main( int argc , char *argv[] ){&lt;br /&gt;
	int n = atoi( argv[1] );&lt;br /&gt;
	lineandir( &amp;quot;./&amp;quot; , n );&lt;br /&gt;
	return(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[Bash esercizio 3]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Bash&amp;quot;&amp;gt;&lt;br /&gt;
#Esercizio 3: Script bash o Python: (10 punti):&lt;br /&gt;
#Il comando che dovrete implementare come script shell o programma python e' updatedir. Updatedir prende due directorycome parametri.&lt;br /&gt;
#updatedir dira dirb deve copiare in dirb tutti i file regolari che sono in dira e non in dirb. Se un file regolare e' presente con lo stesso nome sia in&lt;br /&gt;
#dira sia in dirb, il file deve essere copiato dalla dira alla dirb solo se i contenuti differiscono.&lt;br /&gt;
&lt;br /&gt;
#! /bin/bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
for file in &amp;quot;$1&amp;quot;/*; do&lt;br /&gt;
	if [[ -f $file ]] ; then          #checks if the file is regular&lt;br /&gt;
		thereisnotfile=1          #variable that identify if the file is also in dir2&lt;br /&gt;
		for file2 in &amp;quot;$2&amp;quot;/*; do&lt;br /&gt;
			if [[ -f $file2 ]] ; then&lt;br /&gt;
				if [[  $file2 !=  $file ]] ; then      #checks if the file is only in dir1 and not in dir2&lt;br /&gt;
					continue&lt;br /&gt;
				else&lt;br /&gt;
					thereisnotfile=0            #the file is in both dir&lt;br /&gt;
				fi&lt;br /&gt;
				if [[ $thereisnotfile -eq 0 ]]; then      &lt;br /&gt;
					if [[ $(md5sum &amp;quot;$file&amp;quot;) != $(md5sum &amp;quot;$file2&amp;quot;) ]] ; then   #checks if the file in dir1 is different of file in dir2 by md5sum &lt;br /&gt;
						bn=$(basename &amp;quot;$file&amp;quot;)&lt;br /&gt;
						cp $file  &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot;&lt;br /&gt;
						thereisnotfile=2        #is set in this way for not continue to iterate&lt;br /&gt;
					fi&lt;br /&gt;
				fi&lt;br /&gt;
			fi&lt;br /&gt;
		done&lt;br /&gt;
		if [[ $thereisnotfile -eq 1 ]]; then&lt;br /&gt;
			bn=$(basename &amp;quot;$file&amp;quot;)&lt;br /&gt;
			cp $file  &amp;quot;$2&amp;quot;/&amp;quot;$bn&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;		&lt;br /&gt;
Pirata&lt;br /&gt;
&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;
function usage {&lt;br /&gt;
  command=$(basename &amp;quot;$0&amp;quot;)&lt;br /&gt;
  echo &amp;quot;Usage: $command source destination&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if [[ ! -d $1 ]]&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Source is not a dir&amp;quot;&lt;br /&gt;
  usage&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [[ ! -d $2 ]]&lt;br /&gt;
then&lt;br /&gt;
  echo &amp;quot;Destination is not a dir&amp;quot;&lt;br /&gt;
  usage&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
find $1 -type f -print0 | while IFS= read -r -d $'\0' file; do&lt;br /&gt;
  filename=$(basename &amp;quot;$file&amp;quot;)&lt;br /&gt;
  if [[ -f &amp;quot;$2$filename&amp;quot; ]]&lt;br /&gt;
  then&lt;br /&gt;
  	  cp &amp;quot;$file&amp;quot; &amp;quot;$2$filename&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
  	  if cmp -s &amp;quot;$file&amp;quot; &amp;quot;$2$filename&amp;quot;&lt;br /&gt;
  	  then&lt;br /&gt;
  	  	  /* Do nothing are the same */&lt;br /&gt;
  	  else&lt;br /&gt;
  	  	  cp &amp;quot;$file&amp;quot; &amp;quot;$2$filename&amp;quot;&lt;br /&gt;
  	  fi&lt;br /&gt;
  fi	  &lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mrta&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2010.07.12&amp;diff=574</id>
		<title>ProvaTeorica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2010.07.12&amp;diff=574"/>
		<updated>2014-04-14T15:36:34Z</updated>

		<summary type="html">&lt;p&gt;Mrta: Created page with &amp;quot;== Esercizio 2 ==  Fatto dal professore  &amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;  # Esercizio 2: Message passing con priorita'. Sia dato un servizio di message passing asincrono. Si i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 2 ==&lt;br /&gt;
&lt;br /&gt;
Fatto dal professore&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Esercizio 2: Message passing con priorita'. Sia dato un servizio di message passing asincrono. Si implementi un servizio&lt;br /&gt;
# di message passing con priorita' senza fare uso di processi server. Il nuovo servizio ha due chiamate psend(dest, prio,&lt;br /&gt;
# msg) e precv(sender). La precv consente la ricezione da chiunque (sender==*). Quando un processo P chiama la precv&lt;br /&gt;
# questa deve restituire il messaggio di massima priorita' fra quelli spediti dal sender specificato a P o sospendere il&lt;br /&gt;
# processo se non ce ne sono in attesa. (suggerimento: se serve si puo' usare la funzione getpid() che restituisce&lt;br /&gt;
# l'identificativo del processo chiamante).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
psend(dest, pio, msg)&lt;br /&gt;
  asend(dest,(MSG,getpid(),prio,msg))&lt;br /&gt;
&lt;br /&gt;
precv(sender)&lt;br /&gt;
  asend(getpid,(NULLTAG,getpid(),NULL,NULL))&lt;br /&gt;
  do:&lt;br /&gt;
    (tag,senderx,prio,msg)=arev(*)&lt;br /&gt;
    if(tag==MSG):&lt;br /&gt;
      msgdb.add(senderx,prio,msg)&lt;br /&gt;
    while tag!=NULLTAG.&lt;br /&gt;
    while (m=msgdb.getmaxprio(sender))=None:&lt;br /&gt;
      (tag,senderx,prio,msg)=arev(*)&lt;br /&gt;
      msgdb.add(senderx,prio,msg)&lt;br /&gt;
    return m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.06.15&amp;diff=573</id>
		<title>ProvaTeorica 2012.06.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.06.15&amp;diff=573"/>
		<updated>2014-04-14T15:23:32Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2012-06-15.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * URL: http://www.cs.unibo.it/~renzo/so/compiti/2012-06-15.tot.pdf&lt;br /&gt;
 * author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor palindrome5&lt;br /&gt;
{&lt;br /&gt;
	// Struttura che rappresenta i numeri bloccati&lt;br /&gt;
	typedef struct&lt;br /&gt;
	{&lt;br /&gt;
		condition C;&lt;br /&gt;
		int N;&lt;br /&gt;
	} Stopped;&lt;br /&gt;
&lt;br /&gt;
	Stopped stopped[10];&lt;br /&gt;
	for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
		stopped[i].N = 0;&lt;br /&gt;
	int n = 0;&lt;br /&gt;
	int palindrome[10];&lt;br /&gt;
	repeated = {} // Python-like dictionary&lt;br /&gt;
	&lt;br /&gt;
	procedure entry synch(int index)&lt;br /&gt;
	{&lt;br /&gt;
		// Se ho raggiunto la lunghezza del palindromo&lt;br /&gt;
		if (n == 10)&lt;br /&gt;
		{&lt;br /&gt;
			// Azzero le variabili&lt;br /&gt;
			n = 0;&lt;br /&gt;
			repeated = {};&lt;br /&gt;
		}&lt;br /&gt;
		// [Case 1] parte sinistra del palindromo&lt;br /&gt;
		if (n &amp;lt; 5)&lt;br /&gt;
		{&lt;br /&gt;
			// Se il numero e' gia' stato inserito&lt;br /&gt;
			if (repeated[index])&lt;br /&gt;
			{&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;&lt;br /&gt;
			}&lt;br /&gt;
			palindrome[n++] = index;&lt;br /&gt;
			repeated[index] = true;&lt;br /&gt;
		}&lt;br /&gt;
		// [Case 2] parte destra del palindromo&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			int number = palindrome[n - 5];&lt;br /&gt;
			/* [Case 1] Esiste (almeno) un numero in attesa che corrisponde al numero che &lt;br /&gt;
			   si deve inserire. Lo riattivo. In questo modo evito la starvation. */&lt;br /&gt;
			if (stopped[number].N &amp;gt; 0)&lt;br /&gt;
			{&lt;br /&gt;
				stopped[number].C.signal();&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;&lt;br /&gt;
			}&lt;br /&gt;
			/* [Case 2] Non esiste un numero in attesa che corrisponde al numero che &lt;br /&gt;
			   si deve inserire. Inoltre l'attuale non corrisponde al numero che &lt;br /&gt;
			   si deve inserire. */			&lt;br /&gt;
			else if (number != index)&lt;br /&gt;
			{&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;				&lt;br /&gt;
			}&lt;br /&gt;
			palindrome[n++] = index;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio del professore da rivedere&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
condition c[10]; /* current != -1 &amp;amp;&amp;amp;  ((pali &amp;amp;&amp;amp; !i in seq) || (ndrome &amp;amp;&amp;amp; seq[n]==i)) */&lt;br /&gt;
int current=-1;&lt;br /&gt;
boolean waiting[10];&lt;br /&gt;
boolean pali=True;&lt;br /&gt;
boolean ndrome=False;&lt;br /&gt;
int seq[5];&lt;br /&gt;
int n=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry synch(i) {&lt;br /&gt;
  waiting[i]=True;&lt;br /&gt;
  if(current==i) {&lt;br /&gt;
    current=-1;&lt;br /&gt;
    if(pali) {&lt;br /&gt;
      if(n==4) ndrone=True, pali = False;&lt;br /&gt;
      if(x=anynotin(seq, n, waiting))&lt;br /&gt;
        c[x].signal();&lt;br /&gt;
    } else {&lt;br /&gt;
      c[seq[n]].signal;&lt;br /&gt;
      if(n==0) ndrone=False, pali=True;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if(current!=-1 || pali &amp;amp;&amp;amp; cerca(i, seq, n)!=0 || (ndrome &amp;amp;&amp;amp; n!=4))&lt;br /&gt;
    c[i].wait();&lt;br /&gt;
  if(pali)&lt;br /&gt;
    seq[n++]==i;&lt;br /&gt;
  else&lt;br /&gt;
    n--;&lt;br /&gt;
  current=i;&lt;br /&gt;
  waiting[i]=False;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio c.2 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Esercizio c.2: Implementare facendo uso di un processo server e usando le asend() e areceive() le seguenti primitive&lt;br /&gt;
di comunicazione:&lt;br /&gt;
sx2send(m,dest1,dest2); Invia il messaggio m o a dest1 o a dest2 (ma non ad entrambi)&lt;br /&gt;
m = sx2receive(sender); Riceve un messaggio in maniera sincrona.&lt;br /&gt;
il mittente e il destinatario devono riattivarsi solo quando il destinatario ha ricevuto il messaggio.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
def sx2send(m,dest1,dest2):&lt;br /&gt;
  asend(SND,getpid(),dest1,dest2,m),server)&lt;br /&gt;
  arecv(server);&lt;br /&gt;
&lt;br /&gt;
def(sx2receive(sender):&lt;br /&gt;
    asend((RECV,getpid(),sender,NULL,NULL),server)&lt;br /&gt;
    return arecv(server)&lt;br /&gt;
    &lt;br /&gt;
process server:&lt;br /&gt;
  waiting=Set({})&lt;br /&gt;
  pending=[]&lt;br /&gt;
  while(True):&lt;br /&gt;
    (tag,proc,pi1,p2,m)=arecv(*)&lt;br /&gt;
    if(TAG==SND)&lt;br /&gt;
      if p1 in waiting:&lt;br /&gt;
        asend(m,p1)&lt;br /&gt;
        asend(ACK,proc)&lt;br /&gt;
        waiting-={p1}&lt;br /&gt;
      else if p2 in waiting:&lt;br /&gt;
        asend(m,p2)&lt;br /&gt;
        asend(ACK,proc)&lt;br /&gt;
        waiting-={p2}&lt;br /&gt;
      else pending.append((proc,m,p1,p2))&lt;br /&gt;
   else: #TAG==RECV&lt;br /&gt;
     if(px,mx,p1x,p2x)=searchpending(pending,sender):&lt;br /&gt;
       #cerca il primo che ha sender come uno dei destinatari&lt;br /&gt;
       #ed elimina l'elemento dalla sequenza&lt;br /&gt;
       asend(mx,sender)&lt;br /&gt;
       asend(ACK,mx)&lt;br /&gt;
     else:&lt;br /&gt;
       waiting+={sender}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.06.15&amp;diff=572</id>
		<title>ProvaTeorica 2012.06.15</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaTeorica_2012.06.15&amp;diff=572"/>
		<updated>2014-04-14T15:02:34Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2012-06-15.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * URL: http://www.cs.unibo.it/~renzo/so/compiti/2012-06-15.tot.pdf&lt;br /&gt;
 * author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
monitor palindrome5&lt;br /&gt;
{&lt;br /&gt;
	// Struttura che rappresenta i numeri bloccati&lt;br /&gt;
	typedef struct&lt;br /&gt;
	{&lt;br /&gt;
		condition C;&lt;br /&gt;
		int N;&lt;br /&gt;
	} Stopped;&lt;br /&gt;
&lt;br /&gt;
	Stopped stopped[10];&lt;br /&gt;
	for (int i = 0; i &amp;lt; 10; i++)&lt;br /&gt;
		stopped[i].N = 0;&lt;br /&gt;
	int n = 0;&lt;br /&gt;
	int palindrome[10];&lt;br /&gt;
	repeated = {} // Python-like dictionary&lt;br /&gt;
	&lt;br /&gt;
	procedure entry synch(int index)&lt;br /&gt;
	{&lt;br /&gt;
		// Se ho raggiunto la lunghezza del palindromo&lt;br /&gt;
		if (n == 10)&lt;br /&gt;
		{&lt;br /&gt;
			// Azzero le variabili&lt;br /&gt;
			n = 0;&lt;br /&gt;
			repeated = {};&lt;br /&gt;
		}&lt;br /&gt;
		// [Case 1] parte sinistra del palindromo&lt;br /&gt;
		if (n &amp;lt; 5)&lt;br /&gt;
		{&lt;br /&gt;
			// Se il numero e' gia' stato inserito&lt;br /&gt;
			if (repeated[index])&lt;br /&gt;
			{&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;&lt;br /&gt;
			}&lt;br /&gt;
			palindrome[n++] = index;&lt;br /&gt;
			repeated[index] = true;&lt;br /&gt;
		}&lt;br /&gt;
		// [Case 2] parte destra del palindromo&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			int number = palindrome[n - 5];&lt;br /&gt;
			/* [Case 1] Esiste (almeno) un numero in attesa che corrisponde al numero che &lt;br /&gt;
			   si deve inserire. Lo riattivo. In questo modo evito la starvation. */&lt;br /&gt;
			if (stopped[number].N &amp;gt; 0)&lt;br /&gt;
			{&lt;br /&gt;
				stopped[number].C.signal();&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;&lt;br /&gt;
			}&lt;br /&gt;
			/* [Case 2] Non esiste un numero in attesa che corrisponde al numero che &lt;br /&gt;
			   si deve inserire. Inoltre l'attuale non corrisponde al numero che &lt;br /&gt;
			   si deve inserire. */			&lt;br /&gt;
			else if (number != index)&lt;br /&gt;
			{&lt;br /&gt;
				// Mi fermo e attendo di essere sbloccato&lt;br /&gt;
				stopped[index].N++;&lt;br /&gt;
				stopped[index].C.wait();&lt;br /&gt;
				stopped[index].N--;				&lt;br /&gt;
			}&lt;br /&gt;
			palindrome[n++] = index;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio del professore da rivedere&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
condition c[10]; /* current != -1 &amp;amp;&amp;amp;  ((pali &amp;amp;&amp;amp; !i in seq) || (ndrome &amp;amp;&amp;amp; seq[n]==i)) */&lt;br /&gt;
int current=-1;&lt;br /&gt;
boolean waiting[10];&lt;br /&gt;
boolean pali=True;&lt;br /&gt;
boolean ndrome=False;&lt;br /&gt;
int seq[5];&lt;br /&gt;
int n=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry synch(i) {&lt;br /&gt;
  waiting[i]=True;&lt;br /&gt;
  if(current==i) {&lt;br /&gt;
    current=-1;&lt;br /&gt;
    if(pali) {&lt;br /&gt;
      if(n==4) ndrone=True, pali = False;&lt;br /&gt;
      if(x=anynotin(seq, n, waiting))&lt;br /&gt;
        c[x].signal();&lt;br /&gt;
    } else {&lt;br /&gt;
      c[seq[n]].signal;&lt;br /&gt;
      if(n==0) ndrone=False, pali=True;&lt;br /&gt;
      &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if(current!=-1 || pali &amp;amp;&amp;amp; cerca(i, seq, n)!=0 || (ndrome &amp;amp;&amp;amp; n!=4))&lt;br /&gt;
    c[i].wait();&lt;br /&gt;
  if(pali)&lt;br /&gt;
    seq[n++]==i;&lt;br /&gt;
  else&lt;br /&gt;
    n--;&lt;br /&gt;
  current=i;&lt;br /&gt;
  waiting[i]=False;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2005.02.10&amp;diff=571</id>
		<title>ProvaPratica 2005.02.10</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2005.02.10&amp;diff=571"/>
		<updated>2014-04-09T15:47:21Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
In una rete token-ring, i nodi sono organizzati ad anello e si scambiano un “token” che passa da un nodo al successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Quando un processo riceve il token:&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: ho ricevuto il token”&amp;lt;br&amp;gt;&lt;br /&gt;
● attende 1 secondo&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: spedisco il token al processo x”&amp;lt;br&amp;gt;&lt;br /&gt;
● spedisce il token al processo x&amp;lt;br&amp;gt;&lt;br /&gt;
dove pid è l'identificatore del processo che stampa, e x è l'identificatore del processo successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Scrivere un programma che genera N processi che comunicano tramite &amp;quot;token-ring&amp;quot;. Viene lasciata allo studente la scelta&amp;lt;br&amp;gt;&lt;br /&gt;
del meccanismo di sincronizzazione/comunicazione (ma vedi punto 2).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Prova Pratica di Laboratorio di Sistemi Operativi&lt;br /&gt;
10 febbraio 2005&lt;br /&gt;
Esercizio 1&lt;br /&gt;
&lt;br /&gt;
URL: http://www.cs.unibo.it/~renzo/so/pratiche/2005.02.10.pdf&lt;br /&gt;
&lt;br /&gt;
Nota: variazione che prevede un gestore (Master), di un token ring&lt;br /&gt;
      composto da n processi figli (Slaves).&lt;br /&gt;
&lt;br /&gt;
@author: Tommaso Ognibene&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Dependencies&lt;br /&gt;
#include &amp;lt;ctype.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Constants&lt;br /&gt;
#define True       1&lt;br /&gt;
#define False      0&lt;br /&gt;
&lt;br /&gt;
// Data types&lt;br /&gt;
struct tokenRing&lt;br /&gt;
{&lt;br /&gt;
	pid_t Pid;&lt;br /&gt;
	int Token[2];&lt;br /&gt;
	int Output[2];&lt;br /&gt;
	struct tokenRing *Next, *Prev;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef struct tokenRing TokenRing;&lt;br /&gt;
&lt;br /&gt;
// Function declarations&lt;br /&gt;
static inline void errorAndDie(const char *msg);&lt;br /&gt;
static inline void printAndDie(const char *msg);&lt;br /&gt;
static inline void testTokenRing(int n);&lt;br /&gt;
static inline int isNumber(char *text);&lt;br /&gt;
&lt;br /&gt;
// Entry point&lt;br /&gt;
extern void run(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	// Pre-conditions&lt;br /&gt;
	if (argc != 2)&lt;br /&gt;
		printAndDie(&amp;quot;The function requires one parameter to be passed in.&amp;quot;);&lt;br /&gt;
	if (!isNumber(argv[1]))&lt;br /&gt;
		printAndDie(&amp;quot;The parameter should be a natural number.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	testTokenRing(atoi(argv[1]));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Check whether a string is a natural number or not&lt;br /&gt;
 * Input:   str,  the string&lt;br /&gt;
 * Output:  1,    if the string is a natural number&lt;br /&gt;
 * 			0,    else&lt;br /&gt;
 */&lt;br /&gt;
static inline int isNumber(char *str)&lt;br /&gt;
{&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	i = 0;&lt;br /&gt;
	while (i &amp;lt; strlen(str) &amp;amp;&amp;amp; isdigit(str[i]))&lt;br /&gt;
		i++;&lt;br /&gt;
&lt;br /&gt;
	return i == strlen(str);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Create a token ring of n processes.&lt;br /&gt;
 * The parent shall manage the token ring.&lt;br /&gt;
 * Run a test showing the main logical steps in the parent standard output.&lt;br /&gt;
 * Input: n, the number of processes&lt;br /&gt;
 */&lt;br /&gt;
static inline void testTokenRing(int n)&lt;br /&gt;
{&lt;br /&gt;
	const char fifoPath[] = &amp;quot;token.fifo&amp;quot;;&lt;br /&gt;
	char token[5] = &amp;quot;token&amp;quot;;&lt;br /&gt;
	char buffer[512];&lt;br /&gt;
	int i, fifo;&lt;br /&gt;
	pid_t pid;&lt;br /&gt;
	ssize_t count;&lt;br /&gt;
	TokenRing *it, *first, *temp;&lt;br /&gt;
&lt;br /&gt;
	// First element of the token ring&lt;br /&gt;
	first = it = (TokenRing *) malloc(sizeof (TokenRing));&lt;br /&gt;
&lt;br /&gt;
	// Create the named pipe if it does not yet exist&lt;br /&gt;
	if (access(fifoPath, F_OK) &amp;lt; 0)&lt;br /&gt;
		if (mkfifo(fifoPath, S_IRWXU) &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;mkfifo&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	for (i = 0; i &amp;lt; n; i++)&lt;br /&gt;
	{&lt;br /&gt;
		// Create a pipe for token communication&lt;br /&gt;
		if (pipe(it-&amp;gt;Token) &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;pipe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Create a pipe for output redirection&lt;br /&gt;
		if (pipe(it-&amp;gt;Output) &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;pipe&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Fork&lt;br /&gt;
		pid = fork();&lt;br /&gt;
		if (pid &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;fork&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Child process&lt;br /&gt;
		if (pid == 0)&lt;br /&gt;
		{&lt;br /&gt;
			// Open named pipe for writing&lt;br /&gt;
			fifo = open(fifoPath, O_WRONLY);&lt;br /&gt;
			if (fifo &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;open&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Close output side&lt;br /&gt;
			if (close(it-&amp;gt;Token[1]) &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Close input side&lt;br /&gt;
			if (close(it-&amp;gt;Output[0]) &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			// Re-direct the standard output&lt;br /&gt;
			if (dup2(it-&amp;gt;Output[1], STDOUT_FILENO) &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;dup2&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			while (True)&lt;br /&gt;
			{&lt;br /&gt;
				// Clear the buffer&lt;br /&gt;
				memset(buffer, 0, sizeof (buffer));&lt;br /&gt;
&lt;br /&gt;
				// Wait for the token&lt;br /&gt;
				count = read(it-&amp;gt;Token[0], buffer, sizeof (buffer));&lt;br /&gt;
				if (count &amp;lt; 0)&lt;br /&gt;
					errorAndDie(&amp;quot;read&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
				fprintf(stdout, &amp;quot;[slave #%d] Received the token from Master.\n&amp;quot;, getpid());&lt;br /&gt;
				fprintf(stdout, &amp;quot;[slave #%d] I'm gonna do some stuff now.\n&amp;quot;, getpid());&lt;br /&gt;
				fflush(stdout);&lt;br /&gt;
				sleep(2);&lt;br /&gt;
				fprintf(stdout, &amp;quot;[slave #%d] Giving back the token to Master.\n&amp;quot;, getpid());&lt;br /&gt;
				fflush(stdout);&lt;br /&gt;
&lt;br /&gt;
				// Give the token back&lt;br /&gt;
				count = write(fifo, token, sizeof (token));&lt;br /&gt;
				if (count &amp;lt; 0)&lt;br /&gt;
					errorAndDie(&amp;quot;write&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			// Close the pipes&lt;br /&gt;
			if (close(it-&amp;gt;Token[0]) &amp;lt; 0 || close(it-&amp;gt;Output[1]) &amp;lt; 0 || close(fifo) &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			exit(EXIT_SUCCESS);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Close unused sides of the pipes&lt;br /&gt;
		if (close(it-&amp;gt;Token[0]) &amp;lt; 0 || close(it-&amp;gt;Output[1]) &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		it-&amp;gt;Pid = pid;&lt;br /&gt;
&lt;br /&gt;
		if (i + 1 == n)&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		it-&amp;gt;Next = (TokenRing *) malloc(sizeof (TokenRing));&lt;br /&gt;
		temp = it;&lt;br /&gt;
		it = it-&amp;gt;Next;&lt;br /&gt;
		it-&amp;gt;Prev = temp;&lt;br /&gt;
	}&lt;br /&gt;
	it-&amp;gt;Next = first;&lt;br /&gt;
	first-&amp;gt;Prev = it;&lt;br /&gt;
&lt;br /&gt;
	// Open named pipe for reading&lt;br /&gt;
	fifo = open(fifoPath, O_RDONLY);&lt;br /&gt;
	if (fifo &amp;lt; 0)&lt;br /&gt;
		errorAndDie(&amp;quot;open&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Manage the token ring&lt;br /&gt;
	it = first;&lt;br /&gt;
	while (True)&lt;br /&gt;
	{&lt;br /&gt;
		// Clear the buffer&lt;br /&gt;
		memset(buffer, 0, sizeof (buffer));&lt;br /&gt;
&lt;br /&gt;
		// Assign the token&lt;br /&gt;
		printf(&amp;quot;[Master] Assigning the token to slave #%d\n&amp;quot;, it-&amp;gt;Pid);&lt;br /&gt;
		count = write(it-&amp;gt;Token[1], token, sizeof (token));&lt;br /&gt;
		if (count &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;write&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		// Redirect the children output&lt;br /&gt;
		for (i = 0; i &amp;lt; 2; i++)&lt;br /&gt;
		{&lt;br /&gt;
			count = read(it-&amp;gt;Output[0], buffer, sizeof (buffer));&lt;br /&gt;
			if (count &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;read&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
			if (write(STDOUT_FILENO, buffer, count) &amp;lt; 0)&lt;br /&gt;
				errorAndDie(&amp;quot;write&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Wait for the token in return&lt;br /&gt;
		count = read(fifo, buffer, sizeof (buffer));&lt;br /&gt;
		if (count &amp;lt; 0)&lt;br /&gt;
			errorAndDie(&amp;quot;read&amp;quot;);&lt;br /&gt;
		printf(&amp;quot;[Master] Received the token from slave #%d\n&amp;quot;, it-&amp;gt;Pid);&lt;br /&gt;
&lt;br /&gt;
		it = it-&amp;gt;Next;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Close the pipes&lt;br /&gt;
	if (close(it-&amp;gt;Token[1]) &amp;lt; 0 || close(it-&amp;gt;Output[0]) &amp;lt; 0 || close(fifo) &amp;lt; 0)&lt;br /&gt;
		errorAndDie(&amp;quot;close&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Remove the named pipe&lt;br /&gt;
	if (unlink(fifoPath) &amp;lt; 0)&lt;br /&gt;
		errorAndDie(&amp;quot;unlink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Print error message and exit&lt;br /&gt;
 * Input: msg, the error message&lt;br /&gt;
 */&lt;br /&gt;
static inline void errorAndDie(const char *msg)&lt;br /&gt;
{&lt;br /&gt;
	perror(msg);&lt;br /&gt;
	exit(EXIT_FAILURE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Print message and exit&lt;br /&gt;
 * Input: msg, the message&lt;br /&gt;
 */&lt;br /&gt;
static inline void printAndDie(const char *msg)&lt;br /&gt;
{&lt;br /&gt;
	printf(&amp;quot;%s\n&amp;quot;, msg);&lt;br /&gt;
	exit(EXIT_FAILURE);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esercizio del professore da revisionare&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static int token=42;&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        int n=atoi(argv[1]);&lt;br /&gt;
        char *s;&lt;br /&gt;
        pid_t firstproc,nextproc,newproc;&lt;br /&gt;
        firstproc=newproc=fork();&lt;br /&gt;
        nextproc=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                if (newproc==0) {&lt;br /&gt;
                        int fdin, fdout;&lt;br /&gt;
                        //nextproc e' il successivo&lt;br /&gt;
                        if (nextproc != 0) {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                        } else {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                read(fdin,&amp;amp;nextproc,sizeof(nextproc));&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        while (1) {&lt;br /&gt;
                                int buf;&lt;br /&gt;
                                read(fdin, &amp;amp;buf, sizeof(buf));&lt;br /&gt;
                                printf(&amp;quot;%d ricevuto il token\n&amp;quot;,getpid());&lt;br /&gt;
                                sleep(1);&lt;br /&gt;
                                printf(&amp;quot;%d spedisco il token a %d\n&amp;quot;,getpid(),nextproc);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        exit(0);&lt;br /&gt;
                }&lt;br /&gt;
                nextproc=newproc;&lt;br /&gt;
                if (i&amp;lt;n-1) newproc=fork();&lt;br /&gt;
        }&lt;br /&gt;
        int fdout;&lt;br /&gt;
        asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
        mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
        fdout=open(s,O_WRONLY);&lt;br /&gt;
        free(s);&lt;br /&gt;
        write(fdout, &amp;amp;firstproc, sizeof(firstproc));&lt;br /&gt;
        close(fdout);&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                int status;&lt;br /&gt;
                wait(&amp;amp;status);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2015.02.10&amp;diff=570</id>
		<title>ProvaPratica 2015.02.10</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2015.02.10&amp;diff=570"/>
		<updated>2014-04-09T15:44:54Z</updated>

		<summary type="html">&lt;p&gt;Mrta: Mrta moved page ProvaPratica 2015.02.10 to ProvaPratica 2055.02.10&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[ProvaPratica 2055.02.10]]&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2055.02.10&amp;diff=569</id>
		<title>ProvaPratica 2055.02.10</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2055.02.10&amp;diff=569"/>
		<updated>2014-04-09T15:44:54Z</updated>

		<summary type="html">&lt;p&gt;Mrta: Mrta moved page ProvaPratica 2015.02.10 to ProvaPratica 2055.02.10&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
In una rete token-ring, i nodi sono organizzati ad anello e si scambiano un “token” che passa da un nodo al successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Quando un processo riceve il token:&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: ho ricevuto il token”&amp;lt;br&amp;gt;&lt;br /&gt;
● attende 1 secondo&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: spedisco il token al processo x”&amp;lt;br&amp;gt;&lt;br /&gt;
● spedisce il token al processo x&amp;lt;br&amp;gt;&lt;br /&gt;
dove pid è l'identificatore del processo che stampa, e x è l'identificatore del processo successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Scrivere un programma che genera N processi che comunicano tramite &amp;quot;token-ring&amp;quot;. Viene lasciata allo studente la scelta&amp;lt;br&amp;gt;&lt;br /&gt;
del meccanismo di sincronizzazione/comunicazione (ma vedi punto 2).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static int token=42;&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        int n=atoi(argv[1]);&lt;br /&gt;
        char *s;&lt;br /&gt;
        pid_t firstproc,nextproc,newproc;&lt;br /&gt;
        firstproc=newproc=fork();&lt;br /&gt;
        nextproc=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                if (newproc==0) {&lt;br /&gt;
                        int fdin, fdout;&lt;br /&gt;
                        //nextproc e' il successivo&lt;br /&gt;
                        if (nextproc != 0) {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                        } else {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                read(fdin,&amp;amp;nextproc,sizeof(nextproc));&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        while (1) {&lt;br /&gt;
                                int buf;&lt;br /&gt;
                                read(fdin, &amp;amp;buf, sizeof(buf));&lt;br /&gt;
                                printf(&amp;quot;%d ricevuto il token\n&amp;quot;,getpid());&lt;br /&gt;
                                sleep(1);&lt;br /&gt;
                                printf(&amp;quot;%d spedisco il token a %d\n&amp;quot;,getpid(),nextproc);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        exit(0);&lt;br /&gt;
                }&lt;br /&gt;
                nextproc=newproc;&lt;br /&gt;
                if (i&amp;lt;n-1) newproc=fork();&lt;br /&gt;
        }&lt;br /&gt;
        int fdout;&lt;br /&gt;
        asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
        mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
        fdout=open(s,O_WRONLY);&lt;br /&gt;
        free(s);&lt;br /&gt;
        write(fdout, &amp;amp;firstproc, sizeof(firstproc));&lt;br /&gt;
        close(fdout);&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                int status;&lt;br /&gt;
                wait(&amp;amp;status);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2055.02.10&amp;diff=568</id>
		<title>ProvaPratica 2055.02.10</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2055.02.10&amp;diff=568"/>
		<updated>2014-04-09T15:43:06Z</updated>

		<summary type="html">&lt;p&gt;Mrta: Created page with &amp;quot;== Esercizio 1 ==  In una rete token-ring, i nodi sono organizzati ad anello e si scambiano un “token” che passa da un nodo al successivo.&amp;lt;br&amp;gt; Quando un processo riceve il...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
In una rete token-ring, i nodi sono organizzati ad anello e si scambiano un “token” che passa da un nodo al successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Quando un processo riceve il token:&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: ho ricevuto il token”&amp;lt;br&amp;gt;&lt;br /&gt;
● attende 1 secondo&amp;lt;br&amp;gt;&lt;br /&gt;
● stampa “pid: spedisco il token al processo x”&amp;lt;br&amp;gt;&lt;br /&gt;
● spedisce il token al processo x&amp;lt;br&amp;gt;&lt;br /&gt;
dove pid è l'identificatore del processo che stampa, e x è l'identificatore del processo successivo.&amp;lt;br&amp;gt;&lt;br /&gt;
Scrivere un programma che genera N processi che comunicano tramite &amp;quot;token-ring&amp;quot;. Viene lasciata allo studente la scelta&amp;lt;br&amp;gt;&lt;br /&gt;
del meccanismo di sincronizzazione/comunicazione (ma vedi punto 2).&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static int token=42;&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
        int i;&lt;br /&gt;
        int n=atoi(argv[1]);&lt;br /&gt;
        char *s;&lt;br /&gt;
        pid_t firstproc,nextproc,newproc;&lt;br /&gt;
        firstproc=newproc=fork();&lt;br /&gt;
        nextproc=0;&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                if (newproc==0) {&lt;br /&gt;
                        int fdin, fdout;&lt;br /&gt;
                        //nextproc e' il successivo&lt;br /&gt;
                        if (nextproc != 0) {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                        } else {&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,getpid());&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdin=open(s,O_RDONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                read(fdin,&amp;amp;nextproc,sizeof(nextproc));&lt;br /&gt;
                                asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
                                mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
                                fdout=open(s,O_WRONLY);&lt;br /&gt;
                                free(s);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        while (1) {&lt;br /&gt;
                                int buf;&lt;br /&gt;
                                read(fdin, &amp;amp;buf, sizeof(buf));&lt;br /&gt;
                                printf(&amp;quot;%d ricevuto il token\n&amp;quot;,getpid());&lt;br /&gt;
                                sleep(1);&lt;br /&gt;
                                printf(&amp;quot;%d spedisco il token a %d\n&amp;quot;,getpid(),nextproc);&lt;br /&gt;
                                write(fdout, &amp;amp;token, sizeof(token));&lt;br /&gt;
                        }&lt;br /&gt;
                        exit(0);&lt;br /&gt;
                }&lt;br /&gt;
                nextproc=newproc;&lt;br /&gt;
                if (i&amp;lt;n-1) newproc=fork();&lt;br /&gt;
        }&lt;br /&gt;
        int fdout;&lt;br /&gt;
        asprintf(&amp;amp;s,&amp;quot;/tmp/np%03d&amp;quot;,nextproc);&lt;br /&gt;
        mknod(s,S_IFIFO | 0644, 0);&lt;br /&gt;
        fdout=open(s,O_WRONLY);&lt;br /&gt;
        free(s);&lt;br /&gt;
        write(fdout, &amp;amp;firstproc, sizeof(firstproc));&lt;br /&gt;
        close(fdout);&lt;br /&gt;
        for (i=0; i&amp;lt;n; i++) {&lt;br /&gt;
                int status;&lt;br /&gt;
                wait(&amp;amp;status);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=567</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=567"/>
		<updated>2014-04-09T14:48:35Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
P1: 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW&lt;br /&gt;
P2: 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW&lt;br /&gt;
&lt;br /&gt;
time 1234567890123456789012345678901234567890&lt;br /&gt;
CPU   111111122111111122111111122111111122&lt;br /&gt;
IO   122     112222   112222   112222   1 22&lt;br /&gt;
&lt;br /&gt;
time 1234567890123456789012345678901234567890&lt;br /&gt;
CPU   11221111122111122111 2211111111  11111&lt;br /&gt;
IO   122  2222 112222  22221122      11     1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=566</id>
		<title>ProvaPratica 2010.07.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2010.07.12&amp;diff=566"/>
		<updated>2014-04-09T14:47:02Z</updated>

		<summary type="html">&lt;p&gt;Mrta: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2010-07-12.tot.pdf&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
int aggiorna_maxprio(int maxprio,int prio,int waiting[]){&lt;br /&gt;
int i;&lt;br /&gt;
if(waiting[maxprio] == 0)&lt;br /&gt;
	{&lt;br /&gt;
       	maxprio=0;&lt;br /&gt;
		for(i=prio;i&amp;gt;=0;i--)&lt;br /&gt;
		{&lt;br /&gt;
			if(waiting[i]!=0)&lt;br /&gt;
			{&lt;br /&gt;
			maxprio=i;&lt;br /&gt;
			break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
return maxprio;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
condition run[10];&lt;br /&gt;
int waiting[10]=0,0,0,0,0,0,0,0,0,0;&lt;br /&gt;
int maxprio=0;&lt;br /&gt;
int occupato=0;&lt;br /&gt;
&lt;br /&gt;
procedure entry init(prio){	&lt;br /&gt;
	if(occupato==1)&lt;br /&gt;
	{&lt;br /&gt;
		if(maxprio &amp;lt; prio)&lt;br /&gt;
		{&lt;br /&gt;
		maxprio=prio;&lt;br /&gt;
		}&lt;br /&gt;
	waiting[prio]++;			&lt;br /&gt;
	run[prio].wait();&lt;br /&gt;
	waiting[prio]--;&lt;br /&gt;
	maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
	}&lt;br /&gt;
occupato=1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry yield(prio){&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
        if(maxprio &amp;lt; prio)&lt;br /&gt;
	{&lt;br /&gt;
	maxprio=prio;&lt;br /&gt;
	}&lt;br /&gt;
waiting[prio]++;&lt;br /&gt;
run[prio].wait();&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
procedure entry fini(prio){&lt;br /&gt;
occupato=0;&lt;br /&gt;
waiting[prio]--;&lt;br /&gt;
maxprio=aggiorna_maxprio(maxprio,prio,waiting);		&lt;br /&gt;
run[maxprio].signal();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Alessandro&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//Processo con prioritá 0 = Processo con piú alta prioritá&lt;br /&gt;
//Processo con prioritá 9 = Processo con meno prioritá&lt;br /&gt;
monitor priocoop {&lt;br /&gt;
	condition oktogo[10];&lt;br /&gt;
	int wait[10] = 0,0,0,0,0,0,0,0,0;&lt;br /&gt;
	int running;&lt;br /&gt;
	priocoop.init(prio) {&lt;br /&gt;
		if(running != 0) {&lt;br /&gt;
			wait[prio]++;&lt;br /&gt;
			oktogo[prio].wait;&lt;br /&gt;
			wait[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.yield(prio) {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				wait[prio]++;&lt;br /&gt;
				oktogo[prio].wait;&lt;br /&gt;
				wait[prio]--;&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		running++;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	priocoop.fini() {&lt;br /&gt;
		running--;&lt;br /&gt;
		for(int i = 0;i&amp;lt;10;i++) {&lt;br /&gt;
			if(wait[i] != 0) {&lt;br /&gt;
				oktogo[i].signal();&lt;br /&gt;
				break();&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
//0: priorita' maggiore&lt;br /&gt;
//9: priorita' minore&lt;br /&gt;
cond oktoenter[10];&lt;br /&gt;
int count[10];&lt;br /&gt;
bool running = false;&lt;br /&gt;
&lt;br /&gt;
//restituisce la priorita' maggiore che ha un processo in attesa&lt;br /&gt;
getprio() {&lt;br /&gt;
      	for(i=0;i&amp;lt;10;i++) {&lt;br /&gt;
		 if(count[i]&amp;gt;0)&lt;br /&gt;
			 break;&lt;br /&gt;
	 }&lt;br /&gt;
	 return i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
priocoop() {&lt;br /&gt;
	init (prio) {&lt;br /&gt;
		if (running) {&lt;br /&gt;
			count[prio]++;&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
		running = true;&lt;br /&gt;
	}&lt;br /&gt;
	yield(prio) {&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if (i &amp;lt; 10) {&lt;br /&gt;
			// running = false; &lt;br /&gt;
			oktoenter[i].signal();&lt;br /&gt;
			count(prio)++&lt;br /&gt;
			oktoenter[proc].wait();&lt;br /&gt;
	                // running = true;&lt;br /&gt;
        	        count[prio]--;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	fini(prio){&lt;br /&gt;
		i=getprio();&lt;br /&gt;
		if(i&amp;lt;10)&lt;br /&gt;
			oktoenter[i].signal;&lt;br /&gt;
		else&lt;br /&gt;
			running=false;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Stefano B.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
monitor priocoop{&lt;br /&gt;
	condition oktoenter[10];&lt;br /&gt;
	queue waiting[10];&lt;br /&gt;
	&lt;br /&gt;
	procedure entry init(int prio){&lt;br /&gt;
		if(!(prio &amp;gt;= 0 &amp;amp;&amp;amp; prio&amp;lt;=9))&lt;br /&gt;
			exit(0);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry yield(int prio){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
		if(priority&amp;gt;=0){ /* se non ci fosse questo controllo avremmo un caso di deadlock&lt;br /&gt;
						  * in quanto le code sono vuote */&lt;br /&gt;
			waiting[prio].enqueue();&lt;br /&gt;
			oktoenter[prio].wait();&lt;br /&gt;
			waiting[prio].dequeue(); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	procedure entry fini(){&lt;br /&gt;
		int priority=-1;&lt;br /&gt;
		for (i=0; i&amp;lt;10; i++) {&lt;br /&gt;
			if (! waiting[i].isempty())&lt;br /&gt;
				priority=i;&lt;br /&gt;
		}&lt;br /&gt;
		oktoenter[priority].signal();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Francesca e Giulia&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
db.getpriortymax(); //funzione che restituisce il messaggio con prioritá maggiore e lo rimuove dal db o 0 nel caso il db sia vuoto&lt;br /&gt;
Process n: {&lt;br /&gt;
&lt;br /&gt;
	psend(dest, prio,msg) {&lt;br /&gt;
		asend((msg, prio),dest);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	precv(sender) {&lt;br /&gt;
		while((msg,prio) = arecv(sender)) {&lt;br /&gt;
			db[sender].insert((msg,prio));&lt;br /&gt;
		}&lt;br /&gt;
		return (db[sender].getpriortymax());&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
-Midolo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Esercizio 3 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
lock=-1;&lt;br /&gt;
&lt;br /&gt;
Process P[i]{&lt;br /&gt;
while(true){&lt;br /&gt;
  do{;}&lt;br /&gt;
  while(twomult.op(lock)==lock);&lt;br /&gt;
  //critical section&lt;br /&gt;
  lock = -lock;&lt;br /&gt;
  //no critical section&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inizialmente:  a=1;   b=1;&lt;br /&gt;
&lt;br /&gt;
Primo processo:&lt;br /&gt;
lock=-1   a=-1   b=1&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
&lt;br /&gt;
Secondo processo:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Siccome lock==b non esce dal while e continua:&lt;br /&gt;
lock=-1  a=1   b=-1&lt;br /&gt;
Si ripeterano sempre gli stessi valori,&lt;br /&gt;
fino al cambio di valore di lock che passa da&lt;br /&gt;
-1 a 1  così :&lt;br /&gt;
lock=1  a=-1  b=-1;&lt;br /&gt;
Siccome lock!=b esce dal while.&lt;br /&gt;
Mentre l'altro processo si bloccherà poichè:&lt;br /&gt;
lock=1  a=1  b=1;&lt;br /&gt;
fino al ritorno di lock al valore -1;&lt;br /&gt;
lock=-1  a=-1  b=1;&lt;br /&gt;
C.V.D&lt;br /&gt;
&lt;br /&gt;
----Alessandro&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;Parte generale&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 1 ==&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
P1: 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW, 1ms IoR, 7ms CPU, 1ms IoW&lt;br /&gt;
P2: 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW, 2ms IoR, 2ms CPU, 2ms IoW&lt;br /&gt;
&lt;br /&gt;
time 1234567890123456789012345678901234567890&lt;br /&gt;
CPU   111111122111111122111111122111111122&lt;br /&gt;
IO   122     112222   112222   112222   1 22&lt;br /&gt;
&lt;br /&gt;
time 1234567890123456789012345678901234567890&lt;br /&gt;
CPU   11221111122111122111 2211111111  11111&lt;br /&gt;
IO   122  2222 112222  22221122      11     1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Esercizio 2 ==&lt;br /&gt;
a) Lo stato è SAFE per x &amp;gt;= 8&lt;br /&gt;
&lt;br /&gt;
Esempio di sequenza:&lt;br /&gt;
&lt;br /&gt;
[[File:So1.png]]&lt;br /&gt;
&lt;br /&gt;
COH valuta 2 = 20 → 15 → 30 → 0 → 30+x → 10+x → 32+x il seguito dipende dal valore di x&lt;br /&gt;
&lt;br /&gt;
La sequenza è: 2 - 1 - 3 - 4&lt;br /&gt;
&lt;br /&gt;
b1) con x = 8 e la sequenza: 2 - 4 si arriva in uno stato UNSAFE&lt;br /&gt;
&lt;br /&gt;
b2) con x = 7 e la sequenza: 2 - 1 si è in uno stato SAFE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Giulia N.&lt;/div&gt;</summary>
		<author><name>Mrta</name></author>
	</entry>
</feed>