Difference between revisions of "ProvaPratica 2012.07.17"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<syntaxhighlight lang = "C"> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #define BUF_SIZE 20 int main(int argc, char** argv){ int ncopie, ...")
 
m (Aggiunta soluzione di un'altro studente e migliorata organizzazione pagina.)
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
==Esercizio 1==
 +
===Soluzione di Alessandro===
 
<syntaxhighlight lang = "C">
 
<syntaxhighlight lang = "C">
 
#include <stdio.h>
 
#include <stdio.h>
Line 8: Line 10:
 
int main(int argc, char** argv){
 
int main(int argc, char** argv){
 
int ncopie, i, ris;
 
int ncopie, i, ris;
char NCOPIA[BUF_SIZE];
 
 
char command[BUF_SIZE];
 
char command[BUF_SIZE];
if (argc!=3) {printf("inserisci due argomenti (ncopie, command)\n"); exit(1);}
+
if (argc<3) {printf("inserisci due o più argomenti (ncopie, command)\n"); exit(1);}
 
ncopie = atoi(argv[1]);
 
ncopie = atoi(argv[1]);
 
strcpy(command, argv[2]);
 
strcpy(command, argv[2]);
Line 17: Line 18:
 
}
 
}
 
else {
 
else {
char *NCOPIA;
+
char *env_el;
NCOPIA = malloc(BUF_SIZE);
+
env_el = malloc(BUF_SIZE);
sprintf(NCOPIA, "%d", i);  
+
sprintf(env_el, "NCOPIA=%d", i);
char *newenviron[] = { NCOPIA};
+
//asprintf
ris = execve(command, NULL, newenviron);
+
//devo aggiungerci in fondo lo zero terminatore
 +
char *newenviron[] = {env_el, (char*) 0};
 +
//argv+2 sono gli argomenti, ovvero tutti gli argomenti passati dopo il secondo
 +
ris = execve(argv[2], argv+2, newenviron);
 
if (ris == -1) {perror("execve"); exit(1);}
 
if (ris == -1) {perror("execve"); exit(1);}
 
}
 
}
 
 
}
 
}
wait(NULL);
+
for (i = 0; i<ncopie; i++) wait(NULL);
 
return 1;
 
return 1;
 +
}</syntaxhighlight>
 +
 +
==Esercizio 2==
 +
===Soluzione di Mrta===
 +
 +
<syntaxhighlight lang="C">
 +
#include <stdio.h>
 +
#include <unistd.h>
 +
#include <stdlib.h>
 +
#include <string.h>
 +
#include <fcntl.h>
 +
#define BUF_SIZE 20
 +
 +
int main(int argc, char** argv){
 +
int ncopie, i, ris;
 +
char command[BUF_SIZE];
 +
if (argc<3) {printf("inserisci due argomenti (ncopie, command)\n"); exit(1);}
 +
ncopie = atoi(argv[1]);
 +
int fd[ncopie];
 +
pid_t pid[ncopie];
 +
for (i = 0; i<ncopie; i++){
 +
char *tmpfile;
 +
asprintf(&tmpfile,"/tmp/ncopie.%d.%d",getpid(),i);
 +
fd[i]=open(tmpfile,O_CREAT|O_RDWR,0600);
 +
unlink(tmpfile);
 +
if((pid[i]=fork())==0){//processo padre
 +
char *NCOPIA;
 +
asprintf(&NCOPIA, "NCOPIA=%d", i);
 +
char *newenviron[] = { NCOPIA, (void *)0};
 +
dup2(fd[i],STDOUT_FILENO);
 +
ris = execve(argv[2], argv+2, newenviron);
 +
if (ris == -1) {perror("execve"); exit(1);}
 +
}
 +
}
 +
for (i = 0; i<ncopie; i++) {
 +
waitpid(pid[i],NULL,0);
 +
lseek(fd[i],SEEK_SET,0);
 +
char *buf[1024];
 +
int n;
 +
while ((n=read(fd[i],buf,1024))>0)
 +
write(STDOUT_FILENO,buf,n);
 +
}
 +
 +
return 1;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Alessandro
+
==Esercizio 3==
(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é)
+
<source lang ="text">
 +
Esame 17 07 12
 +
 
 +
Lo script o il programma Python deve fornire una lista dei file all'interno di un sottoalbero ordinati
 +
secondo il la “profondita'” nell'albero (prima tutti quelli nella radice del sottoalbero,
 +
poi tutti quelli al secondo livello), in ordine alfabetico fra quelli allo stesso livello.
 +
</source>
 +
===Soluzione di Pierg===
 +
<source lang="python">
 +
import os, sys
 +
 
 +
pathname = sys.argv[1]
 +
 
 +
def tree (pathname):
 +
for path, dirs, files in os.walk(pathname):
 +
print dirs
 +
files.sort()
 +
level = path.replace(pathname, '').count(os.sep)
 +
indent = ' ' * 4 * (level)
 +
print('{}{}/'.format(indent, os.path.basename(path)))
 +
subindent = ' ' * 4 * (level + 1)
 +
for file in files:
 +
print('{}{}'.format(subindent, file))
 +
 
 +
tree(pathname)
 +
</source>

Latest revision as of 08:42, 9 May 2017

Esercizio 1

Soluzione di Alessandro

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 20

int main(int argc, char** argv){
	int ncopie, i, ris;
	char command[BUF_SIZE];
	if (argc<3) {printf("inserisci due o più argomenti (ncopie, command)\n"); exit(1);}
	ncopie = atoi(argv[1]);
	strcpy(command, argv[2]);
	for (i = 0; i<ncopie; i++){
		if(fork()){//processo padre
		}
		else {
			char *env_el;
			env_el = malloc(BUF_SIZE);
			sprintf(env_el, "NCOPIA=%d", i);
			//asprintf 
			//devo aggiungerci in fondo lo zero terminatore
			char *newenviron[] = {env_el, (char*) 0};
			//argv+2 sono gli argomenti, ovvero tutti gli argomenti passati dopo il secondo			
			ris = execve(argv[2], argv+2, newenviron);
			if (ris == -1) {perror("execve"); exit(1);}
		}
	}
	for (i = 0; i<ncopie; i++) wait(NULL);
	return 1;
}

Esercizio 2

Soluzione di Mrta

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#define BUF_SIZE 20

int main(int argc, char** argv){
				int ncopie, i, ris;
				char command[BUF_SIZE];
				if (argc<3) {printf("inserisci due argomenti (ncopie, command)\n"); exit(1);}
				ncopie = atoi(argv[1]);
				int fd[ncopie];
				pid_t pid[ncopie];
				for (i = 0; i<ncopie; i++){
								char *tmpfile;
								asprintf(&tmpfile,"/tmp/ncopie.%d.%d",getpid(),i);
								fd[i]=open(tmpfile,O_CREAT|O_RDWR,0600);
								unlink(tmpfile);
								if((pid[i]=fork())==0){//processo padre
												char *NCOPIA;
												asprintf(&NCOPIA, "NCOPIA=%d", i); 
												char *newenviron[] = { NCOPIA, (void *)0};	
												dup2(fd[i],STDOUT_FILENO);
												ris = execve(argv[2], argv+2, newenviron);
												if (ris == -1) {perror("execve"); exit(1);}
								}
				}
				for (i = 0; i<ncopie; i++) {
								waitpid(pid[i],NULL,0);
								lseek(fd[i],SEEK_SET,0);
								char *buf[1024];
								int n;
								while ((n=read(fd[i],buf,1024))>0)
												write(STDOUT_FILENO,buf,n);
				}

				return 1;
}

Esercizio 3

Esame 17 07 12

Lo script o il programma Python deve fornire una lista dei file all'interno di un sottoalbero ordinati 
secondo il la “profondita'” nell'albero (prima tutti quelli nella radice del sottoalbero,
poi tutti quelli al secondo livello), in ordine alfabetico fra quelli allo stesso livello.

Soluzione di Pierg

import os, sys

pathname = sys.argv[1]

def tree (pathname):
	for path, dirs, files in os.walk(pathname):
		print dirs
		files.sort()
		level = path.replace(pathname, '').count(os.sep)
		indent = ' ' * 4 * (level)
		print('{}{}/'.format(indent, os.path.basename(path)))
		subindent = ' ' * 4 * (level + 1)
		for file in files:
			print('{}{}'.format(subindent, file))

tree(pathname)