Difference between revisions of "Prova pratica 2016.09.13"

From Sistemi Operativi
Jump to navigation Jump to search
(Creata pagina con soluzione da sistemare)
 
 
(2 intermediate revisions by 2 users not shown)
Line 17: Line 17:
 
$
 
$
 
</source>
 
</source>
===Proposta di FedericoB===
+
===Soluzione di FedericoB===
Non sono sicuro che funzioni. --[[User:FedericoB|FedericoB]] ([[User talk:FedericoB|talk]]) 14:31, 16 May 2017 (CEST)
 
 
<source lang="c">
 
<source lang="c">
 
#define _GNU_SOURCE
 
#define _GNU_SOURCE
Line 46: Line 45:
 
         flock.l_len = stat_buf.st_size;
 
         flock.l_len = stat_buf.st_size;
 
         flock.l_pid = getpid();
 
         flock.l_pid = getpid();
         fcntl(fdFile2, F_OFD_SETLKW, &flock);
+
         fcntl(fdFile2, F_SETLKW, &flock);
 
         //print "locked"
 
         //print "locked"
 
         printf("locked\n");
 
         printf("locked\n");
Line 57: Line 56:
 
         //unclock second file
 
         //unclock second file
 
         flock.l_type = F_UNLCK;
 
         flock.l_type = F_UNLCK;
         fcntl(fdFile2, F_OFD_SETLKW, &flock);
+
         fcntl(fdFile2, F_SETLKW, &flock);
 
         //print "unlocked"
 
         //print "unlocked"
 
         printf("unlocked\n");
 
         printf("unlocked\n");
Line 69: Line 68:
 
     }
 
     }
 
}
 
}
 +
</source>
 +
==Esercizio 2 ==
 +
<source lang="C">
 +
</source>
 +
==Esercizio 3==
 +
===Bash===
 +
====Soluzione di G.C. ====
 +
<source lang="bash">
 +
#!/bin/bash
 +
 +
if [ $# -lt 1 ] ; then
 +
echo "Argument error"
 +
exit
 +
fi
 +
a=0
 +
find $1 -type f,p,d,c,b,s | (while read line
 +
do
 +
a=$((a+1))
 +
done
 +
 +
echo "Number: $a")
 +
</source>
 +
===Python3===
 +
====Soluzione di G.C. ====
 +
<source lang="python">
 +
import sys
 +
import os
 +
 +
def countFile(d):
 +
count = 1
 +
for x in os.listdir(d):
 +
if os.path.isdir(os.path.join(d,x)):
 +
count += countFile(os.path.join(d,x))
 +
else:
 +
if not os.path.islink(os.path.join(d,x)):
 +
count+=1
 +
return count
 +
 +
if __name__ == '__main__':
 +
if len(sys.argv) < 2:
 +
print("Argument Error")
 +
sys.exit()
 +
directory = sys.argv[1]
 +
count = countFile(directory)
 +
print("Count: ",count)
 
</source>
 
</source>

Latest revision as of 11:17, 17 May 2017

Link al testo (è sbagliata la data nel titolo ma il testo è quello giusto)

Esercizio 1

Scrivere un programma che mostri il funzionamento del file locking.
In particolare il programma cplk avra’ due argomenti che I pathname di due file. Il contenuto del primo file deve
essere copiato nel secondo usando la system call sendfile.
Prima di iniziare la copia occorre usare la system call fcntl per bloccare il file di output (write lock).
Completata la copia occorre chiamare nuovamente la fcntl per sbloccare il file.
Inserire un ritardo (sleep) con valore casuale da 1 a 10 secondi sia prima sia dopo aver sbloccato il file e
stampe di controllo che indichino quando il file viene bloccato e sbloccato.
In questo modo lanciando piu’ esecuzioni concorrenti con output sullo stesso file deve apparire che l’accesso in
scrittura e’ mutualmente esclusivo.
Es. di output:
$ cplk cplk.c out
locked attende da 1 a 10 sec
unlocked attende da 1 a 10 sec
$

Soluzione di FedericoB

#define _GNU_SOURCE

#include <unistd.h>
#include <stdlib.h>
#include <sys/sendfile.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <time.h>

int main(int argc, char* argv[]) {
    if (argc == 3) {
        //get file descriptors
        int fdFile2 = open(argv[2], O_WRONLY);
        int fdFile1 = open(argv[1], O_RDONLY);
        //create structure for file locking
        struct flock flock;
        struct stat stat_buf;
        fstat(fdFile1, &stat_buf);
        //type = write lock
        flock.l_type = F_WRLCK;
        flock.l_start = 0;
        //set l_start relative of beginning of file
        flock.l_whence = SEEK_SET;
        flock.l_len = stat_buf.st_size;
        flock.l_pid = getpid();
        fcntl(fdFile2, F_SETLKW, &flock);
        //print "locked"
        printf("locked\n");
        //use sendfile for copy, use fdFile1 offset and copy all file 1
        sendfile(fdFile2, fdFile1, NULL, stat_buf.st_size);
        //wait for a random time between 1 and 10 seconds
        srand(time(NULL));
        int r = rand() % 10 + 1;
        sleep(r);
        //unclock second file
        flock.l_type = F_UNLCK;
        fcntl(fdFile2, F_SETLKW, &flock);
        //print "unlocked"
        printf("unlocked\n");
        //wait for a random time between 1 and 10 second
        r = rand() % 10 + 1;
        sleep(r);
        return 0;
    } else {
        printf("wrong number of arguments!");
        return -1;
    }
}

Esercizio 2

Esercizio 3

Bash

Soluzione di G.C.

#!/bin/bash

if [ $# -lt 1 ] ; then
	echo "Argument error"
	exit
fi
a=0
find $1 -type f,p,d,c,b,s | (while read line
do
	a=$((a+1))
done

echo "Number: $a")

Python3

Soluzione di G.C.

import sys
import os

def countFile(d):
	count = 1
	for x in os.listdir(d):
		if os.path.isdir(os.path.join(d,x)):
			count += countFile(os.path.join(d,x))
		else:
			if not os.path.islink(os.path.join(d,x)):
				count+=1
	return count

if __name__ == '__main__':
	if len(sys.argv) < 2:
		print("Argument Error")
		sys.exit()
	directory = sys.argv[1]
	count = countFile(directory)
	print("Count: ",count)