<?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=AndreaM</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=AndreaM"/>
	<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php/Special:Contributions/AndreaM"/>
	<updated>2026-04-30T16:56:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=753</id>
		<title>ProvaPratica 2011.09.12</title>
		<link rel="alternate" type="text/html" href="https://so.v2.cs.unibo.it/wiki/index.php?title=ProvaPratica_2011.09.12&amp;diff=753"/>
		<updated>2014-05-23T18:03:47Z</updated>

		<summary type="html">&lt;p&gt;AndreaM: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1&amp;gt;http://www.cs.unibo.it/~renzo/so/compiti/2011-09-12.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;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int N_DIR1=0,N_DIR2=0;&lt;br /&gt;
&lt;br /&gt;
int source(char*s)&lt;br /&gt;
{&lt;br /&gt;
	int x=strlen(s);&lt;br /&gt;
	if (x&amp;gt;=3)&lt;br /&gt;
	{&lt;br /&gt;
		if ((s[x-1]=='c') || (s[x-1]=='h'))&lt;br /&gt;
		{&lt;br /&gt;
			if (s[x-2]=='.') return 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
void print_diff(char**dir1,char**dir2)&lt;br /&gt;
{&lt;br /&gt;
	int i,j,found=0;&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR1;i++){&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR2;j++){&lt;br /&gt;
			if (!strcmp(dir1[i],dir2[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			 }&lt;br /&gt;
			if (found!=1) &lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 1\n&amp;quot;,dir1[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	found=0;&lt;br /&gt;
	&lt;br /&gt;
	for (i=0;i&amp;lt;N_DIR2;i++)&lt;br /&gt;
	{&lt;br /&gt;
		for(j=0;j&amp;lt;N_DIR1;j++){&lt;br /&gt;
			if (!strcmp(dir2[i],dir1[j]))&lt;br /&gt;
				found=1;&lt;br /&gt;
			}&lt;br /&gt;
			if (found!=1)&lt;br /&gt;
				printf(&amp;quot;%s presente solo nella directory 2\n&amp;quot;,dir2[i]);&lt;br /&gt;
			found=0;&lt;br /&gt;
	}&lt;br /&gt;
	return;&lt;br /&gt;
}&lt;br /&gt;
int main (int argc,char*argv[])&lt;br /&gt;
{&lt;br /&gt;
	int ris,i=0;&lt;br /&gt;
	char c;&lt;br /&gt;
	char*tmp;&lt;br /&gt;
	struct stat prova;&lt;br /&gt;
	char**filedir1=NULL,**filedir2=NULL;&lt;br /&gt;
	DIR *dp,*dp2; &lt;br /&gt;
	struct dirent *ep;    &lt;br /&gt;
	if (argc!=3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Usage: ./cmpsource.out DIR1 DIR2\n&amp;quot;);&lt;br /&gt;
		return(1);&lt;br /&gt;
	} &lt;br /&gt;
	/*APERTURA DIRECTORY 1*/&lt;br /&gt;
	dp = opendir (argv[1]);&lt;br /&gt;
	if (dp != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR1++;&lt;br /&gt;
    			filedir1=(char**)realloc(filedir1,N_DIR1*sizeof(char*));&lt;br /&gt;
    			filedir1[N_DIR1-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 1*/&lt;br /&gt;
	/*APERTURA DIRECTORY 2*/&lt;br /&gt;
	dp2 = opendir (argv[2]);&lt;br /&gt;
	if (dp2 != NULL)&lt;br /&gt;
	{&lt;br /&gt;
		while ((ep = readdir (dp2))) /*Leggo i file nella directory*/&lt;br /&gt;
    	{&lt;br /&gt;
    		ris=lstat(ep-&amp;gt;d_name,&amp;amp;prova); /*Recupero le informazioni sul file*/&lt;br /&gt;
    		if (S_ISREG(prova.st_mode)) /*file regolare*/&lt;br /&gt;
    		{ &lt;br /&gt;
    		/*IL FILE E' UN ESEGUIBILE REGOLARE*/&lt;br /&gt;
    			if (source(ep-&amp;gt;d_name)){ /*IL FILE E' UN SORGENTE (.c/.h)*/&lt;br /&gt;
    			N_DIR2++;&lt;br /&gt;
    			filedir2=(char**)realloc(filedir2,N_DIR2*sizeof(char*));&lt;br /&gt;
    			filedir2[N_DIR2-1]=ep-&amp;gt;d_name;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
		}&lt;br /&gt;
		closedir (dp); /*ORA IN filedir1[] CI SONO TUTTI I FILE SORGENTE DELLA DIRECTORY 1*/&lt;br /&gt;
	}&lt;br /&gt;
	/*FINE LETTURA DIRECTORY 2*/&lt;br /&gt;
	print_diff(filedir1,filedir2);&lt;br /&gt;
  	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
stefano92&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;
#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;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int lastchar(char *name){&lt;br /&gt;
		int i=0;&lt;br /&gt;
		while(name[i]!='\0')&lt;br /&gt;
			i++;&lt;br /&gt;
		return(i-1);&lt;br /&gt;
	}//restituisce l'indice dell'ultimo carattere della stringa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]){&lt;br /&gt;
	char dir1[1024];&lt;br /&gt;
	char dir2[1024];&lt;br /&gt;
	int n1, n2;&lt;br /&gt;
	struct dirent **namelist1;&lt;br /&gt;
	struct dirent **namelist2;&lt;br /&gt;
	struct stat buf1;&lt;br /&gt;
	struct stat buf2;&lt;br /&gt;
	int lc;&lt;br /&gt;
	&lt;br /&gt;
	if(argc==3){ /*se vengono passate in input due directory va bene*/&lt;br /&gt;
		strcpy(dir1,argv[1]);&lt;br /&gt;
		strcpy(dir2,argv[2]);&lt;br /&gt;
		n1 = scandir(dir1, &amp;amp;namelist1, NULL, 0);&lt;br /&gt;
		n2 = scandir(dir2, &amp;amp;namelist2, NULL, 0);&lt;br /&gt;
		if(n1&amp;lt;0 || n2&amp;lt;0)&lt;br /&gt;
			perror(&amp;quot;scandir&amp;quot;);&lt;br /&gt;
		else {&lt;br /&gt;
			int index[n1];&lt;br /&gt;
			int i=0;&lt;br /&gt;
			int j=0; //delimitatore&lt;br /&gt;
			while(n1--){&lt;br /&gt;
				stat(namelist1[n1]-&amp;gt;d_name,&amp;amp;buf1);&lt;br /&gt;
				lc = lastchar(namelist1[n1]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist1[n1]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist1[n1]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist1[n1]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						index[i]=n1;&lt;br /&gt;
						i++;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			j=i;&lt;br /&gt;
			int bool=0;&lt;br /&gt;
			while(n2--){&lt;br /&gt;
				stat(namelist2[n2]-&amp;gt;d_name,&amp;amp;buf2);&lt;br /&gt;
				lc = lastchar(namelist2[n2]-&amp;gt;d_name);&lt;br /&gt;
				if((namelist2[n2]-&amp;gt;d_name[lc]=='c' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.') ||&lt;br /&gt;
					(namelist2[n2]-&amp;gt;d_name[lc]=='h' &amp;amp;&amp;amp;&lt;br /&gt;
					namelist2[n2]-&amp;gt;d_name[lc-1]=='.')){	&lt;br /&gt;
						for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
							if(strcmp(namelist2[n2]-&amp;gt;d_name, namelist1[index[i]]-&amp;gt;d_name)==0){ //sono uguali&lt;br /&gt;
								bool=1;&lt;br /&gt;
								index[i]=-1;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
						if(bool==0)&lt;br /&gt;
							printf(&amp;quot;%s not in %s\n&amp;quot;,namelist2[n2]-&amp;gt;d_name,dir1);&lt;br /&gt;
				}&lt;br /&gt;
			bool=0;&lt;br /&gt;
			}&lt;br /&gt;
			printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
			for(i=0; i&amp;lt;j; i++){&lt;br /&gt;
				if(index[i]&amp;gt;=0)&lt;br /&gt;
					printf(&amp;quot;%s not in %s\n&amp;quot;,namelist1[index[i]]-&amp;gt;d_name,dir2);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else /*altrimenti errore, vogliamo in input 2 directory*/&lt;br /&gt;
			printf(&amp;quot;errore\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
GiuliaN.&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;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define FALSE 0&lt;br /&gt;
#define TRUE !FALSE&lt;br /&gt;
#define O_RDONLY &amp;quot;r&amp;quot;&lt;br /&gt;
&lt;br /&gt;
int selector (const struct dirent *fileName);&lt;br /&gt;
int diff (char* firstFile, char* secondFile);&lt;br /&gt;
&lt;br /&gt;
int selector (const struct dirent *fileName)&lt;br /&gt;
{&lt;br /&gt;
	int index;&lt;br /&gt;
	char* nameOfFile;&lt;br /&gt;
&lt;br /&gt;
	nameOfFile = strdup (fileName-&amp;gt;d_name);&lt;br /&gt;
	if (strlen (nameOfFile)&amp;gt;2){&lt;br /&gt;
		for (index = 0; index &amp;lt;strlen(nameOfFile); index++)&lt;br /&gt;
		{&lt;br /&gt;
			if(nameOfFile[index] == '.')&lt;br /&gt;
			{&lt;br /&gt;
				if (nameOfFile[index+1] == 'c')&lt;br /&gt;
				{&lt;br /&gt;
					// &amp;quot;.c&amp;quot; is extension and not part of the name&lt;br /&gt;
					if (!nameOfFile[index+2])&lt;br /&gt;
					{&lt;br /&gt;
						return TRUE;&lt;br /&gt;
					}&lt;br /&gt;
				} else if (nameOfFile[index+1] == 'h')&lt;br /&gt;
				{&lt;br /&gt;
					// &amp;quot;.h&amp;quot; is extension and not part of the name&lt;br /&gt;
					if (!nameOfFile[index+2])&lt;br /&gt;
					{&lt;br /&gt;
						return TRUE;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}	&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int diff (char* firstFile, char* secondFile)&lt;br /&gt;
{&lt;br /&gt;
    int sameFile = 1;&lt;br /&gt;
    FILE *fp;&lt;br /&gt;
    FILE *fp2;&lt;br /&gt;
    char charFirstFile; &lt;br /&gt;
    char charSecondFile;&lt;br /&gt;
&lt;br /&gt;
    fp = fopen (firstFile, O_RDONLY);&lt;br /&gt;
    fp2 = fopen (secondFile, O_RDONLY);&lt;br /&gt;
    while (((charFirstFile = getc (fp)) != EOF) &amp;amp;&amp;amp; ((charSecondFile = getc (fp2)) != EOF))&lt;br /&gt;
    {&lt;br /&gt;
        if (charFirstFile != charSecondFile) &lt;br /&gt;
        {&lt;br /&gt;
             sameFile = 0;        &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    fclose (fp);&lt;br /&gt;
    fclose (fp2);&lt;br /&gt;
    return sameFile;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[])&lt;br /&gt;
{&lt;br /&gt;
	struct dirent **nameListFirstDir;&lt;br /&gt;
	struct dirent **nameListSecondDir;&lt;br /&gt;
	int numberOfElementFirstList;&lt;br /&gt;
	int numberOfElementSecondList;&lt;br /&gt;
	int indexOfFirstList;&lt;br /&gt;
	int indexOfSecondList;&lt;br /&gt;
	bool equal;&lt;br /&gt;
&lt;br /&gt;
	if (argc != 3)&lt;br /&gt;
	{&lt;br /&gt;
		printf(&amp;quot;Wrong number of parameters\nUsage: ./cmpsource firstDirectory secondDirectory\n&amp;quot;);&lt;br /&gt;
		return EXIT_FAILURE;&lt;br /&gt;
	}&lt;br /&gt;
	 numberOfElementFirstList = scandir (argv[1], &amp;amp;nameListFirstDir, selector, alphasort);&lt;br /&gt;
	 if (numberOfElementFirstList &amp;lt; 0)&lt;br /&gt;
	 {&lt;br /&gt;
	 	perror (&amp;quot;Scandir first directory&amp;quot;);&lt;br /&gt;
	 }&lt;br /&gt;
	 numberOfElementSecondList = scandir (argv[2], &amp;amp;nameListSecondDir, selector, alphasort);&lt;br /&gt;
	 if (numberOfElementSecondList &amp;lt; 0)&lt;br /&gt;
	 {&lt;br /&gt;
	 	perror (&amp;quot;Scandir first directory&amp;quot;);&lt;br /&gt;
	 }&lt;br /&gt;
	 for (indexOfFirstList = 0; indexOfFirstList &amp;lt; numberOfElementFirstList; indexOfFirstList++)&lt;br /&gt;
	 {&lt;br /&gt;
	 	for (indexOfSecondList = 0; indexOfSecondList &amp;lt; numberOfElementSecondList; indexOfSecondList++)&lt;br /&gt;
	 	{&lt;br /&gt;
	 		if (!(strcmp (nameListFirstDir[indexOfFirstList]-&amp;gt;d_name, nameListSecondDir[indexOfSecondList]-&amp;gt;d_name)))&lt;br /&gt;
	 		{&lt;br /&gt;
	 			equal = TRUE;&lt;br /&gt;
	 			if (diff (nameListFirstDir[indexOfFirstList]-&amp;gt;d_name, nameListSecondDir[indexOfSecondList]-&amp;gt;d_name))&lt;br /&gt;
	 			{&lt;br /&gt;
	 				printf(&amp;quot;%s %s differ\n&amp;quot;, nameListFirstDir[indexOfFirstList]-&amp;gt;d_name, nameListSecondDir[indexOfSecondList]-&amp;gt;d_name);&lt;br /&gt;
	 			}&lt;br /&gt;
	 		}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	if (!equal)&lt;br /&gt;
	 	{&lt;br /&gt;
	 		printf(&amp;quot;%s/%s not in %s\n&amp;quot;,argv[1],nameListFirstDir[indexOfFirstList]-&amp;gt;d_name,argv[2]);&lt;br /&gt;
	 	}&lt;br /&gt;
	 }&lt;br /&gt;
&lt;br /&gt;
	 equal = FALSE;&lt;br /&gt;
&lt;br /&gt;
	 for (indexOfSecondList = 0; indexOfSecondList &amp;lt; numberOfElementSecondList; indexOfSecondList++)&lt;br /&gt;
	 {&lt;br /&gt;
	 	for (indexOfFirstList = 0; indexOfFirstList &amp;lt; numberOfElementFirstList; indexOfFirstList++)&lt;br /&gt;
	 	{&lt;br /&gt;
	 		if (!(strcmp (nameListSecondDir[indexOfSecondList]-&amp;gt;d_name, nameListFirstDir[indexOfFirstList]-&amp;gt;d_name)))&lt;br /&gt;
	 		{&lt;br /&gt;
	 			equal = TRUE;&lt;br /&gt;
	 		}&lt;br /&gt;
	 	}&lt;br /&gt;
	 	if (!equal)&lt;br /&gt;
	 	{&lt;br /&gt;
	 		printf(&amp;quot;%s/%s not in %s\n&amp;quot;,argv[2],nameListSecondDir[indexOfSecondList]-&amp;gt;d_name,argv[1]);&lt;br /&gt;
	 	}&lt;br /&gt;
	 }&lt;br /&gt;
	 return EXIT_SUCCESS;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mengo&lt;/div&gt;</summary>
		<author><name>AndreaM</name></author>
	</entry>
</feed>