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