...

Esame luglio 05

by user

on
Category: Documents
14

views

Report

Comments

Transcript

Esame luglio 05
Laboratorio di Sistemi Operativi: Prof.ssa A. Rescigno
Anno Acc. 2004-2005
Prova d’esame Luglio 2005
Università di Salerno
Nome e Cognome:
1
/10
Classe 1
p-p
Matricola:
2
/11
3
/10
4
5
/14
/8
6
/47
Classe 2
p-d
tot
/100
Spazio riservato alla correzione
1. 10 punti
a) Descrivere che cosa fa il seguente script.
PS3=">?"
select frutta in "mela" "arancia" "melone"; do
if [ $frutta ]; then
echo Ti piace $frutta; break
else
echo Nessuna frutta
fi
done
b) Scrivere uno script shell in cui data una lista di interi da linea di comando, si ottenga sullo
standard output il triplo di ciascuno di tali interi.
Prova d’esame
2
2. 11 punti
É noto che la system call unlink é un’operazione atomica. Si descriva utilizzando un esempio
che cosa potrebbe accadere se ció non fosse. Giustificare la risposta.
Prova d’esame
3. 10 punti
a) Si consideri il seguente programma:
#include <stdio.h>
int main(void) {
char arry[ ]="Finisco\n";
printf("Inizio\n");
write(1,arry,9);
}
Sia a.out il suo eseguibile. Spiegare dettagliatamente perché dando
a.out > file
cat file
si ottiene
Finisco
Inizio
3
Prova d’esame
b) Si consideri il seguente programma
#include <stdio.h>
int main(void) {
char arry[ ]="Finisco\n";
printf("Inizio\n");
fflush(stdout);
write(1,arry,9);
}
Sia a.out il suo eseguibile. Spiegare dettagliatamente perché dando
a.out > file
cat file
si ottiene
Inizio
Finisco
4
Prova d’esame
4. 14 punti
Si consideri il seguente programma e si supponga di compilarlo.
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include"ourhdr.h"
int main(){
if (access("prova.txt", R_OK)<0)
err_ret("access error per prova.txt");
else printf("access OK\n");
if (access("tentativo.txt", R_OK)<0)
err_ret("access error per tentativo.txt");
else printf("open OK\n");
if (open("prova.txt", O_RDONLY)<0)
err_ret("open error per prova.txt");
else printf("open OK\n");
if (open("tentativo.txt", O_RDONLY)<0)
err_ret("open error per tentativo.txt");
else printf("open OK\n");
exit(0);
}
Se fosse
-rwxrwxrwx 1 rescigno 10932 Jun 4 10:45 a.out
-rw------- 1 rescigno 1891 Jun 4 09:45 prova.txt
-rw------- 1 studente 1891 Jun 4 08:45 tentativo.txt
supponendo che il real user ID sia studente dire
1) che cosa succede dando a.out.
2) Si assuma ora di settare il set-user-id di a.out. Dire se ci sono cambiamenti dando a.out.
In entrambi i casi la risposta va giustificata.
5
Prova d’esame
6
7
Prova d’esame
5. 8 punti
a) Si supponga di mandare in esecuzione il seguente programma:
int main(void)
{
pid_t
pid1, pid2;
pid1 = fork();
pid2 = fork();
exit(0);
}
Dire quanti processi vengono generati. Giustificare la risposta.
b) Si supponga di mandare in esecuzione il seguente programma:
int main(void)
{
pid_t
pid1, pid2;
pid1 = fork();
if (pid1>0) {
pid2 = fork();
exit(0);
}
Dire quanti processi vengono generati. Giustificare la risposta.
Prova d’esame
8
6. 47 punti
Si consideri il seguente scenario:
Sia S un processo server e sia C un generico processo client. Ciascun processo client riceve
dall’utente un intero che invia al server S e poi dorme per 40 secondi. Il server S riceve da
linea di comando una lista di numeri e si comporta in maniera differente in relazione ai casi
sottoelencati.
a) (12 punti) La comunicazione da client a server avviene attraverso una FIFO. Il server S
ammazza il processo se il numero che gli ha inviato é nell’elenco, altrimenti lo lascia vivere.
b) (20 punti) La comunicazione da client a server avviene attraverso memoria condivisa
gestita da un semaforo. Il server S dopo che aver lasciato trascorrere 30 sec verifica se i numeri
passati dai processi client sono nell’elenco, uccidendoli in caso affermativo e lasciandoli vivere
altrimenti.
c) (15 punti) La comunicazione tra client e server avviene attraverso code di messaggi. Il
server S invia al client un messaggio in cui lo si invita ad uscire, se il numero inviatogli é
nell’elenco, ed in cui gli si chiede di dormire 10 sec, altrimenti.
Prova d’esame
9
Prova d’esame
10
Prova d’esame
11
Fly UP