Il compito è costituito da domande chiuse, domande aperte ed es

Transcript

Il compito è costituito da domande chiuse, domande aperte ed es
Parziale “Laboratorio di Sistemi Operativi” 28-04-2008
Cognome
Nome
Mat.
Il compito è costituito da domande chiuse, domande aperte ed esercizi. Non è consentito l’uso di
libri, manuali, appunti., etc. Tempo massimo 2 ore.
Domande chiuse: ogni domanda corrisponde ad un punteggio di 1 punto in caso di risposta esatta,
0 in caso di risposta errata o in assenza di risposta. Solo una risposta è corretta.
1) Qual è la maschera simbolica dei permessi espressi dalla notazione ottale 655
rws r-x r-x
r-x r-x --x
rwx r-x r-x
Nessuna delle precedenti
2) Il comando ps –ef | grep defunct | sort
Cerca tutti i processi attivi
Stampa in ordine alfabetico tutte le linee del file defunct
Visualizza i processi attualmente nello stato Zombie nel sistema
Stampa in ordine alfabetico le righe del file ps –ef contenenti la stringa defunct
3) Il file /usr/bin/passwd ha i seguenti permessi r-s --x –x e quindi:
Con la exec vengono modificati lo user-id e il group-id del processo; il programma viene
eseguito con l’user-id del propretario del file
Il proprietario ha il diritto di scrittura, il programma viene eseguito con lo user-id del login
Nessun utente può eseguire il file
Nessuna delle precedenti
4) La tabella dei file aperti di un processo (u-ofile) è allocata in:
Nella process area del descrittore di processo
Nella user area del descrittore di processo
Nella swap area
Nella i-list che identifica i file aperti
5) Un link hardware
Ha un i-number diverso rispetto al file che referenzia
Ha lo stesso i-number del file che referenzia
Collega una periferica hardware
Identifica un driver
6) Quale sequenza di comandi consente di
(identificata dal file /dev/sdb1)
“montare” il file system
mkdir mount_point; mount /dev/sdb1 mount_point
mount /dev/sdb1 disk
mount
chmod a+x /dev/sdb1; mount /dev/sdb1
1
di una chiavetta
Parziale “Laboratorio di Sistemi Operativi” 28-04-2008
Cognome
Nome
Mat.
Domande aperte: ogni domanda corrisponde ad un punteggio variabile tra 0 e 3 punti a seconda
della correttezza, completezza e sinteticità della risposta.
A1 Spiegare le modalità con cui vengono “passati” i file descriptor dal processo padre al processo
figlio descrivendo la system call fork e le strutture dati del File System coinvolte nella open di un
file.
2
Parziale “Laboratorio di Sistemi Operativi” 28-04-2008
Cognome
Nome
Mat.
Esercizi: Viene attribuito un punteggio variabile tra 0 a 8 a seconda della correttezza, completezza
e adeguatezza della soluzione proposta. Utilizzare un linguaggio C-like e le system call UNIX
cercando di essere chiari e strutturati, indicare anche le variabili utilizzate e nel passaggio dei
parametri specificare se per valore o indirizzo.
E1.1 (6 punti) Scrivere un’applicazione che simuli il programma “syslog” di Linux.
Il programma legge da un file (prog.conf) i parametri di funzionamento:
NUM-FIGLI 3
ID-INIZIALE 0
Il processo padre:
- crea una system pipe su cui riceverà i messaggi dai processi figli
- genera un numero di processi pari al valore del parametro NUM-FIGLI
- attribuisce a ciascun figlio un identificativo progressivo a partire dal valore di IDINIZIALE (nell’esempio: id = 0, 1, 2)
- legge i messaggi dalla pipe e per ciascun messaggio contenente 2 interi (id e codice) scrive
una riga in un file di testo (messages) del tipo:
processo “id” , errore “codice”
dove “id” e “codice” sono i 2 valori interi contenuti nel messaggio letto
Il processo figlio:
- estrae un numero random “codice” compreso tra 0-99 con
codice = random(100);
- invia un messaggio al padre contenente “id” e “codice”.
Gestire correttamente la fine dei processi figli con il segnale SIGCLD.
E1.2 (2 punti) Opzionale
Modificare il processo figlio secondo le seguenti indicazioni:
- legge da un file binario un “codice” di errore
- per ogni “codice” di errore invia un messaggio al padre contenente “id” e “codice”
- il nome del file da cui leggere è ottenuto con le seguenti istruzioni:
char nome_file[80], str_id[10];
int id;
sprintf(str_id, “%1d”,id);
strcpy(nome_file,”errore-“);
strcat (nome_file,str_id);
- la lettura deve essere fatta fino a EOF.
3
Parziale “Laboratorio di Sistemi Operativi” 28-04-2008
Cognome
Nome
Mat.
Soluzione esercizio E.1.2 (non è previsto nessun controllo sui valori letti dal file di configurazione)
#include
#include
#include
#include
#include
<stdio.h>
<signal.h>
<stdlib.h>
<string.h>
<fcntl.h>
struct rec {
int id;
int codice;
};
int status;
main()
{
void handler();
int id_iniz,num_figli;
int fd[2];
FILE *fpr, *fpw;
struct rec buffer;
char str1[80], str2[80];
int i,j,child,k;
signal(SIGCLD, (void *)handler);
if ((fpr = fopen("prog.conf","r")) == NULL) {
printf ("errore fopen prog.conf \n");
exit(1);
}
if ((fpw = fopen("messages","w")) == NULL) {
printf ("errore fopen messages \n");
exit(1);
}
fscanf(fpr,"%s%d",str2,&num_figli);
fscanf(fpr,"%s%d",str1,&id_iniz);
printf("num_figli %d\n", num_figli);
printf("id %d \n", id_iniz);
if (pipe(fd) < 0) {
perror("errore creazione pipe");
exit(1);
}
printf("sono il padre dopo la pipe\n");
for (i=0; i<num_figli; i++){
if (fork()==0){
char nome_file[80],str_id[10];
int fdr,nbyte;
sprintf(str_id,"%1d",i+id_iniz);
strcpy(nome_file,"errore-");
strcat(nome_file,str_id);
if ((fdr = open(nome_file,O_RDONLY)) == -1) {
perror ("errore open read: /n");
exit(1);
}
close(fd[0]);
buffer.id=i+id_iniz;
while ((nbyte = read(fdr,&buffer.codice,sizeof(int))) > 0){
write(fd[1],&buffer,sizeof(struct rec));
}
4
Parziale “Laboratorio di Sistemi Operativi” 28-04-2008
Cognome
Nome
Mat.
close(fd[0]);
exit(0);
}
}
close(fd[1]);
while (read(fd[0],&buffer,sizeof(struct rec)) > 0){
fprintf(fpw,"processo %d, errore %d\n", buffer.id, buffer.codice);
printf("processo %d, errore %d\n", buffer.id, buffer.codice);
}
close(fd[0]);
}
void handler (int sig){
int pid;
pid = wait (&status);
printf("terminato figlio %d, con esito %d \n",pid,status);
}
5