Difference between revisions of "Prova pratica 2015.01.21"

From Sistemi Operativi
Jump to navigation Jump to search
m
Line 1: Line 1:
 
Testo: [http://www.cs.unibo.it/~renzo/so/pratiche/2015.01.21.pdf]
 
Testo: [http://www.cs.unibo.it/~renzo/so/pratiche/2015.01.21.pdf]
 +
 +
Esercizio 1
 +
 +
<syntaxhighlight lang="C">
 +
//ESERCIZIO 1
 +
#include <stdio.h>
 +
#include <string.h>
 +
#include <unistd.h>
 +
#include <stdlib.h>
 +
#define BUFFLEN  4096 //probably there is a system constant
 +
 +
int main(int argc,const char* argv[]){
 +
//take the path name and open the file
 +
FILE* fd = fopen(argv[1],"r");
 +
//read the the file and put its content in a array of pointers
 +
char commands[2][BUFFLEN]; //migliorabile
 +
char buffer[BUFFLEN];
 +
int i = 0;
 +
while (fgets(buffer,sizeof(buffer),fd) != NULL){
 +
strcpy(commands[i],buffer);
 +
i ++;
 +
}
 +
//printf("%s\n%s\n",commands[0],commands[1] );
 +
//create a pipe
 +
int fpipe[2];
 +
pipe(fpipe); //0 reading,1 writing
 +
//fork
 +
int pid;
 +
pid = fork();
 +
switch (pid){
 +
case 0 : //children
 +
 +
close(fpipe[0]);
 +
//children's stout = pipe output
 +
dup2(fpipe[1],STDOUT_FILENO);
 +
close(fpipe[1]);
 +
//execution of the command
 +
system(commands[0]);
 +
 +
break;
 +
 +
default : //parent
 +
 +
close(fpipe[1]);
 +
//father's stdin = pipe input
 +
dup2(fpipe[0],STDIN_FILENO);
 +
close(fpipe[0]);
 +
//receive the comnmand
 +
system(commands[1]);
 +
 +
break;
 +
}
 +
}
 +
</syntaxhighlight>
 +
 +
--[[User:LeonardoF|LeonardoF]] ([[User talk:LeonardoF|talk]]) 15:39, 26 March 2017 (CEST)LeonardoF
 +
 +
<syntaxhighlight lang="C">
 +
//ESERCIZIO 2
 +
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <string.h>
 +
#include <unistd.h>
 +
 +
 +
#define AOS_LENSTEP 8
 +
 +
/*
 +
* Define a struct for managing and array of pointer to strings.
 +
*/
 +
struct array_of_strings {
 +
    char **strings;
 +
    size_t currentlength; //the length of number of string in memory
 +
    size_t arraylength; //the length of memory allocated
 +
};
 +
 +
typedef struct array_of_strings array_of_strings;
 +
 +
void array_of_strings_add(array_of_strings *arrayOfStrings, char *string) {
 +
    //if there is not enough space for the string increase it
 +
    if (arrayOfStrings->currentlength >= arrayOfStrings->arraylength) {
 +
        //increase the array length by the size of a string pointer
 +
        size_t newlength = arrayOfStrings->arraylength + AOS_LENSTEP;
 +
        //reallocate the arrayOfString with the new size
 +
        char **new_string = realloc(arrayOfStrings->strings, newlength * sizeof(arrayOfStrings->strings[0]));
 +
        //if the reallocation is successful
 +
        if (new_string != NULL) {
 +
            arrayOfStrings->arraylength = newlength;
 +
            arrayOfStrings->strings = new_string;
 +
        }
 +
    }
 +
    //if there is enough space for the string insert it
 +
    if (arrayOfStrings->currentlength < arrayOfStrings->arraylength)
 +
        //strdup return a pointer to a duplicate of the string
 +
        arrayOfStrings->strings[arrayOfStrings->currentlength++] = strdup(string);
 +
}
 +
 +
void array_of_strings_print(array_of_strings *v) {
 +
    size_t i;
 +
    for (i = 0; i < v->currentlength; i++)
 +
        printf("[%3lu]: %s\n", i, v->strings[i]);
 +
}
 +
 +
int main(int argc, char *argv[]) {
 +
int commandNumber= 0;
 +
    char* line = NULL;
 +
    size_t lineLength = 0;
 +
 +
    ssize_t numberOfCharactersRead;
 +
    static array_of_strings arrayOfStrings;
 +
    FILE* fd = fopen(argv[1],"r");
 +
 +
    while ((numberOfCharactersRead = getline(&line, &lineLength, fd)) >= 0) {
 +
        if (line[numberOfCharactersRead - 1] == '\n')
 +
            line[numberOfCharactersRead - 1] = 0;
 +
        array_of_strings_add(&arrayOfStrings, line);
 +
        commandNumber ++;
 +
    }
 +
free(line);
 +
//array_of_strings_print(&arrayOfStrings);
 +
//printf("%d\n",commandNumber );
 +
//open the pipe
 +
int fpipe[2];
 +
pipe(fpipe); //0 reading,1 writing
 +
int i = 0;
 +
 +
 +
while(commandNumber > 0 ){
 +
if(commandNumber > 1) {
 +
int pid = fork();
 +
switch(pid){
 +
case 0: //children
 +
close(fpipe[0]);
 +
//children's stout = pipe output
 +
dup2(fpipe[1],STDOUT_FILENO);
 +
close(fpipe[1]);
 +
//execution of the command
 +
//usleep( commandNumber* 1000000);
 +
system(arrayOfStrings.strings[i]);
 +
 +
commandNumber = 0;
 +
break;
 +
default: //parent
 +
commandNumber --;
 +
i ++;
 +
break;
 +
}
 +
}
 +
else{ //last command
 +
close(fpipe[1]);
 +
//father's stdin = pipe input
 +
dup2(fpipe[0],STDIN_FILENO);
 +
close(fpipe[0]);
 +
//receive the comnmand
 +
system(arrayOfStrings.strings[i]);
 +
commandNumber --;
 +
}
 +
}
 +
   
 +
}
 +
</syntaxhighlight>
 +
 +
--[[User:LeonardoF|LeonardoF]] ([[User talk:LeonardoF|talk]]) 15:39, 26 March 2017 (CEST)LeonardoF
 +
 +
Esercizio 3 Script Bash
 +
 +
<syntaxhighlight lang="Bash">
 +
#!/bin/bash
 +
#ESERCISIO 3
 +
 +
find $1 -exec md5sum {} \; |sort | uniq  --all-repeated=separate --check-chars=32
 +
shift
 +
 +
for i in $@ ; do
 +
find $1 -exec md5sum {} \; |sort | uniq  --all-repeated=separate --check-chars=32
 +
shift
 +
 +
done
 +
</syntaxhighlight>
 +
 +
--[[User:LeonardoF|LeonardoF]] ([[User talk:LeonardoF|talk]]) 15:39, 26 March 2017 (CEST)LeonardoF
 +
 +
Esercizio 3 Script Python
 +
 +
<syntaxhighlight lang="Python">
 +
#!/usr/bin/env python3
 +
#ESERCIZIO 3
 +
import sys
 +
# os.syscall way to use linux syscalls
 +
import os
 +
import hashlib
 +
 +
dictionary = {}
 +
 +
def add(md5val,path):
 +
"""function that insert the given file path in a dictionary
 +
using as key the given md5sum"""
 +
#in this way i avoid duplicates
 +
dictionary.setdefault(md5val,set()).add(path)
 +
 +
 +
def md5add(path):
 +
"""function that takes a filepath and calculate is md5sum
 +
then it calls a function to insert the file in a dictionary"""
 +
md5val = hashlib.md5()
 +
with open(path, "rb") as f:
 +
#Note that sometimes you won't be able to fit the whole file in memory.
 +
#In that case, you'll have to read chunks of 4096 bytes sequentially and feed them to the Md5 function:
 +
for chunk in iter(lambda: f.read(4096), b""):
 +
md5val.update(chunk)
 +
add(md5val.hexdigest(),path)
 +
 +
 +
def movmd5add(path):
 +
"""recursive fuction that moves in the file system and call the mdadd function
 +
it takes a path in input (main checks the path given by the user) """
 +
for root, dirs, files in os.walk(path):
 +
for f in files:
 +
#if file call the function for the md5sum
 +
md5add(os.path.join(root,f)) # os.path.join(root,f)
 +
 +
 +
 +
def printdict():
 +
"""funtion that prints the dictionary"""
 +
for x in dictionary:
 +
#doesn't print single lines
 +
if len(dictionary[x]) > 1 :
 +
print('\r')
 +
for y in dictionary[x]:
 +
print(x," : ",y)
 +
 +
 +
def main(args):
 +
"""main checks the path and call the functions"""
 +
if len(args) < 1:
 +
args = "."
 +
for path in args:
 +
movmd5add(path)
 +
printdict()
 +
 +
if __name__ == "__main__":
 +
main(sys.argv[1:])
 +
 +
</syntaxhighlight>
 +
 +
--[[User:LeonardoF|LeonardoF]] ([[User talk:LeonardoF|talk]]) 15:39, 26 March 2017 (CEST)LeonardoF
  
 
Esercizio 3
 
Esercizio 3

Revision as of 14:39, 26 March 2017

Testo: [1]

Esercizio 1

//ESERCIZIO 1
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define BUFFLEN  4096 //probably there is a system constant

int main(int argc,const char* argv[]){
	//take the path name and open the file
	FILE* fd = fopen(argv[1],"r");
	//read the the file and put its content in a array of pointers
	char commands[2][BUFFLEN]; //migliorabile
	char buffer[BUFFLEN];
	int i = 0;
	while (fgets(buffer,sizeof(buffer),fd) != NULL){
		strcpy(commands[i],buffer);
		i ++;
	}
	//printf("%s\n%s\n",commands[0],commands[1] );
	//create a pipe
	int fpipe[2];
	pipe(fpipe); //0 reading,1 writing
	//fork
	int pid;
	pid = fork();
	switch (pid){
	case 0 : //children
		
		close(fpipe[0]);
		//children's stout = pipe output
		dup2(fpipe[1],STDOUT_FILENO);
		close(fpipe[1]);
		//execution of the command
		system(commands[0]);
		
		break;

	default : //parent
		
		close(fpipe[1]);
		//father's stdin = pipe input
		dup2(fpipe[0],STDIN_FILENO);
		close(fpipe[0]);
		//receive the comnmand
		system(commands[1]);
		
		break;
	}	
}

--LeonardoF (talk) 15:39, 26 March 2017 (CEST)LeonardoF

//ESERCIZIO 2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

 
#define AOS_LENSTEP 8
 
/*
 * Define a struct for managing and array of pointer to strings.
 */
struct array_of_strings {
    char **strings;
    size_t currentlength; //the length of number of string in memory
    size_t arraylength; //the length of memory allocated
};
 
typedef struct array_of_strings array_of_strings;
 
void array_of_strings_add(array_of_strings *arrayOfStrings, char *string) {
    //if there is not enough space for the string increase it
    if (arrayOfStrings->currentlength >= arrayOfStrings->arraylength) {
        //increase the array length by the size of a string pointer
        size_t newlength = arrayOfStrings->arraylength + AOS_LENSTEP;
        //reallocate the arrayOfString with the new size
        char **new_string = realloc(arrayOfStrings->strings, newlength * sizeof(arrayOfStrings->strings[0]));
        //if the reallocation is successful
        if (new_string != NULL) {
            arrayOfStrings->arraylength = newlength;
            arrayOfStrings->strings = new_string;
        }
    }
    //if there is enough space for the string insert it
    if (arrayOfStrings->currentlength < arrayOfStrings->arraylength)
        //strdup return a pointer to a duplicate of the string
        arrayOfStrings->strings[arrayOfStrings->currentlength++] = strdup(string);
}
 
void array_of_strings_print(array_of_strings *v) {
    size_t i;
    for (i = 0; i < v->currentlength; i++)
        printf("[%3lu]: %s\n", i, v->strings[i]);
}

int main(int argc, char *argv[]) {
	int commandNumber= 0;
    char* line = NULL;
    size_t lineLength = 0;

    ssize_t numberOfCharactersRead;
    static array_of_strings arrayOfStrings;
    FILE* fd = fopen(argv[1],"r");

    while ((numberOfCharactersRead = getline(&line, &lineLength, fd)) >= 0) {
        if (line[numberOfCharactersRead - 1] == '\n')
            line[numberOfCharactersRead - 1] = 0;
        array_of_strings_add(&arrayOfStrings, line);
        commandNumber ++;
    }
 	free(line);
 	//array_of_strings_print(&arrayOfStrings);
 	//printf("%d\n",commandNumber );
 	//open the pipe
 	int fpipe[2];
	pipe(fpipe); //0 reading,1 writing
	int i = 0;

	
 	while(commandNumber > 0 ){
 		if(commandNumber > 1) {
 			int pid = fork();
 			switch(pid){
 				case 0: //children
 						close(fpipe[0]);
						//children's stout = pipe output
						dup2(fpipe[1],STDOUT_FILENO);
						close(fpipe[1]);
						//execution of the command
						//usleep( commandNumber* 1000000);
						system(arrayOfStrings.strings[i]);
				
						commandNumber = 0;
 						break;
 				default: //parent 
 						commandNumber --;
 						i ++;
 						break;
 			}
 		}
 		else{ //last command
 				close(fpipe[1]);
				//father's stdin = pipe input
				dup2(fpipe[0],STDIN_FILENO);
				close(fpipe[0]);
				//receive the comnmand
				system(arrayOfStrings.strings[i]);
				commandNumber --;
 		}
 	}
    
}

--LeonardoF (talk) 15:39, 26 March 2017 (CEST)LeonardoF

Esercizio 3 Script Bash

#!/bin/bash
#ESERCISIO 3

find $1 -exec md5sum {} \; |sort | uniq  --all-repeated=separate --check-chars=32
shift 

for i in $@ ; do
	find $1 -exec md5sum {} \; |sort | uniq  --all-repeated=separate --check-chars=32
	shift

done

--LeonardoF (talk) 15:39, 26 March 2017 (CEST)LeonardoF

Esercizio 3 Script Python

#!/usr/bin/env python3
#ESERCIZIO 3
import sys
# os.syscall way to use linux syscalls
import os
import hashlib

dictionary = {}

def add(md5val,path):
	"""function that insert the given file path in a dictionary
	using as key the given md5sum"""	
	#in this way i avoid duplicates
	dictionary.setdefault(md5val,set()).add(path)
	

def md5add(path):
	"""function that takes a filepath and calculate is md5sum
	then it calls a function to insert the file in a dictionary"""
	md5val = hashlib.md5()
	with open(path, "rb") as f:
		#Note that sometimes you won't be able to fit the whole file in memory. 
		#In that case, you'll have to read chunks of 4096 bytes sequentially and feed them to the Md5 function:
		for chunk in iter(lambda: f.read(4096), b""):
			md5val.update(chunk)
	add(md5val.hexdigest(),path)


def movmd5add(path):
	"""recursive fuction that moves in the file system and call the mdadd function
	it takes a path in input (main checks the path given by the user) """
	for root, dirs, files in os.walk(path):
		for f in files:
			#if file call the function for the md5sum 
			md5add(os.path.join(root,f)) # os.path.join(root,f)



def printdict():
	"""funtion that prints the dictionary"""
	for x in dictionary:
		#doesn't print single lines
		if len(dictionary[x]) > 1 :
			print('\r')
			for y in dictionary[x]:
				print(x," : ",y)


def main(args):
	"""main checks the path and call the functions"""
	if len(args) < 1:
		args = "."
	for path in args:
		movmd5add(path)
	printdict()

if __name__ == "__main__":
		main(sys.argv[1:])

--LeonardoF (talk) 15:39, 26 March 2017 (CEST)LeonardoF

Esercizio 3

#!/usr/bin/python
"""
Esercizio 3: Script bash o Python: (10 punti):
Scrivere un programma python o uno script bash che scandisca il sottoalbero relativo alle directory passate come
parametri (o alla direcotry corrente se non ci sono parametri) e fornisca in output l'elenco dei file che hanno la
stessa somma MD5 (i.e. l'output del comando md5sum).
In output ogni riga deve mostrare un elenco di pathname realtivi a file che hanno la stessa somma MD5 (che quindi
sono molto molto probabilmente uguali).
"""

import sys
import os
import hashlib

def sha1sum(root, filename):
    sha1 = hashlib.sha1()
    with open(os.path.join(root, filename), "rb") as thefile:
        buf = thefile.read()
        sha1.update(buf)
    return sha1.hexdigest()

def initSha1vect(path):
    """ Inizializza il dizionario utilizzando come chiave il sha1
    del file, e come valore il percorso del file. """
    shafiles = {}
    for root, dirs, files in os.walk(path):
        for file in files:
            shaKey = sha1sum(root, file)
            shafiles.setdefault(shaKey, [])
            shafiles[shaKey].append(file)
    return shafiles

def main(args):
    for path in args:
        msg = True
        print "\n", path
        shafiles = initSha1vect(path)
        for k in shafiles:
            if len(shafiles[k]) > 1:
                msg = False
                print k, "\t", shafiles[k]
        if msg:
            print "Nessun file con lo stesso sha1"

if __name__ == "__main__":
	main(sys.argv[1:])

S.G (talk) 14:39, 18 November 2016 (CET)
Ho scritto una possibile soluzione dell'esercizio 3

perché proporre una soluzione in un linguaggio che non ho ancora spiegato?Renzo (talk) 19:36, 21 November 2016 (CET)