Introduzione ai sistemi operativi Unix e Linux Alessandro De Salvo <Alessandro.DeSalvo@roma1.infn.it> Corso di Laboratorio di Calcolo 2005
Il sistema operativo Unix UNIX nasce il 1-1-1971 dalle ceneri di un progetto di sistema operativo (Multics) iniziato nel 1965 nei Bell Laboratories in collaborazione con MIT, AT&T e General Electric Multi-utente Multi-processore Struttura di memorizzazione dati (file system) gerarchica Semplice e chiara interfaccia utente Architettura trasparente e invisibile all’utente Completo ambiente di programmazione L’intero sistema occupava 16K di memoria! Facile portabilità su piattaforme hardware diverse grazie alla riscrittura in linguaggio C nel 1973 Sistema operativo “a strati” (layered OS) Kernel: interazione con l’hardware del computer User: interazione con il kernel Il nuovo sistema operativo viene presentato nel 1974 sotto l’egida dell’AT&T e adottato in maggioranza da università ed entità commerciali
Il sistema operativo Unix (2) Vari tipi di Unix (Unix Flavors) Sistemi Operativi a pagamento AIX (IBM) AIX 5L (Linux) BeOS Digital Unix (Compaq) HP-UX (Hewlett Packard) IRIX (Silicon Graphics) MacOS X (Apple) Solaris (Sun Microsystems) Sistemi Operativi non a pagamento Linux FreeBSD Sistemi Operativi real-time (sistemi che reagiscono in modo temporalmente prevedibile a stimoli esterni imprevedibili) LynxOS QNX
L’architettura di Unix Programmi Utente (eseguibili, shell, …) Programmi Interfaccia per le chiamate di sistema (System Call Interface) Gestione filesystem Gestione memoria Gestione processi Servizi di rete (sockets) Kernel Drivers filesystems TCP/IP drivers Driver IDE Driver SCSI Driver FDD Drivers schede di rete Hardware Hardware
Linux Linus Torvalds, studente dell’università di Helsinki, inizia per hobby nel 1991 la scrittura di un’estensione del mini S.O. UNIX di nome Minix Nel 1994 la prima versione del kernel di Linux vede la luce Linux è sviluppato secondo la licenza GNU General Public License (GPL) e tutto il codice sorgente è distribuito gratuitamente al pubblico Le performances e la versatilità di Linux lo hanno fatto diventare ben presto un sistema operativo di grande diffusione Linux ha introdotto l’idea di OpenSource Accesso al codice sorgente Redistribuzione gratuita del codice e dei programmi compilati Permesso di effettuare modifiche Preservazione dell’integrità del codice sorgente dell’autore
OpenSource Apertura del codice Stabilità Adattabilità Qualità Avere a disposizione il codice sorgente agevola la risoluzione di problemi Stabilità Dal momento che l’OpenSource può contare su una grande comunità di sviluppatori e che tutto il codice sorgente sviluppato deve rimanere pubblico, il software Open Source è generalmente più stabile del software commerciale Adattabilità Il codice OpenSource è strettamente collegato con delle regole standard (Open Standards) e quindi è facilmente adattabile ad ogni altra applicazione OpenSource Qualità I prodotti OpenSource possono essere testati da una grande comunità, che è anche potenzialmente una comunità di sviluppatori Innovazione Ciò che spinge l’OpenSource è la competizione e la possibilità di contribuire comunemente allo sviluppo di un prodotto Costo La maggior parte del software OpenSource è gratis (ma non lo è necessariamente)
Come lavorare in ambiente UNIX Parte II Come lavorare in ambiente UNIX
Accesso al sistema Ogni utente è identificato da una coppia di informazioni Nome dell’utenza (username), pubblica Parola-chiave (password), segreta L’utente accede al sistema fornendo username e password Login: accesso al sistema (da remoto) telnet <nome del computer> Logout: uscita dal sistema exit Più utenti possono lavorare contemporaneamente sulla stessa macchina
Directories e Home Directory La struttura di memorizzazione dati presente nei dischi (filesystem) è una struttura ad albero, in cui i nodi sono directories e le foglie sono directories o files Dopo la login il sistema operativo posiziona ogni utente nella propria directory (home directory) Privilegi di lettura/scrittura solo dei files creati dall’utente Possibilità di protezione da lettura/scrittura/cancellazione da parti di altri utenti I files di sistema possono essere modificati soltanto dal super-utente (root), il solo abilitato al completo controllo della macchina / /usr /boot /home /tmp /home/user1 /home/user2 /home/user3 /home/user4
Interazione con il sistema Riga di comando (case sensitive) Esecuzione di un programma, ad esempio il programma emacs emacs |RETURN| Spostamento all’inizio della riga |CTRL+A| Spostamento alla fine della riga |CTRL+E| Completamento del comando parzialmente digitato ema |TAB| > emacs Copia/incolla testo Copia: selezionare il testo da copiare con il tasto sinistro del mouse Incolla: posizionarsi sul punto desiderato e premere il tasto centrale del mouse Una volta lanciato un programma dalla linea di comando il controllo ritornerà all’utente solo al termine dell’esecuzione del programma stesso Esecuzione di un programma e ritorno immediato del controllo (background mode) gzip pippo.txt & |RETURN|
Comandi base Operazioni comuni Lista dei files nella directory corrente ls |RETURN| Lista dei files il cui nome termina con .txt nella directory corrente ls *.txt |RETURN| Stampa della dimensione e delle proprietà dei files ls –l |RETURN| -rwxr-xr-x 1 desalvo xv 11890 Jun 4 2001 test -rw-r--r-- 1 desalvo xv 148 Jun 4 2001 test.c drwxr-xr-x 2 desalvo xv 4096 Jan 15 22:09 test-directory Stampa del nome della directory di lavoro corrente (full pathname) pwd |RETURN| Cambio di directory cd <nome directory> |RETURN| Ritorno alla directory al livello precedente cd .. |RETURN| Creazione di una nuova directory mkdir <nome directory> |RETURN| Rimozione di una directory vuota rmdir <nome directory> |RETURN|
Comandi base (2) Operazioni comuni (2) Spostamento o rinominazione di files mv <file originale> <nuovo file> |RETURN| Esempio di spostamento: mv pippo.txt txt_files/ Esempio di rinominazione: mv pippo.txt paperino.txt Cancellazione di uno o più files rm <nome file> |RETURN| rm pippo* |RETURN| Copia di un file cp pippo.txt paperino.txt |RETURN| Visualizzazione del contenuto di un file (browsing) more pippo.txt |RETURN| Creazione o modifica di un file di testo (editing) emacs pippo.txt |RETURN| Stampa di un file lpr -P<nome stampante> <nome file> |RETURN| Informazioni sull’uso di un comando man <comando> |RETURN|
Editor di testo Emacs Avvio del programma Uscita da Emacs emacs <nome file> |RETURN| Uscita da Emacs |CTRL-x| |CTRL-c| Salvataggio del file corrente senza uscire dal programma |CTRL-x| |CTRL-s| Cancellazione del contenuto della riga dal cursore in poi |CTRL-k| Annullamento dell’utima operazione (undo) |CTRL-x| u Ricerca di testo in avanti |CTRL-s| <testo da cercare> |RETURN| Ricerca di testo indietro |CTRL-r| <testo da cercare> |RETURN|
Compilazione ed esecuzione di un programma Compilazione di un programma in C gcc –o eseguibile eseguibile.c gcc –o eseguibile –lm eseguibile.c Esecuzione di un programma Dalla directory in cui è registrato l’eseguibile ./eseguibile Nome dell’eseguibile che andiamo a creare Nome del file contenente il codice sorgente da compilare Compilatore Istruzioni al compilatore per il link con la libreria delle funzioni matematiche (libm.a)
Semplice I/O con un programma C Streams Input stream (STDIN): canale di ingresso dei dati Output stream (STDOUT): canale d’uscita dei dati Error stream (STDERR): canale d’uscita dei messaggi di errore Stampa su STDOUT #include <stdio.h> int printf(const char *format, ...); Format string (stringa di caratteri) I caratteri che non iniziano per % vengono copiati direttamente nella stream di output Specificatori di conversione %d numero decimale intero %f numero decimale a virgola mobile %x numero esadecimale %o numero ottale %s stringa di caratteri %c singolo carattere
Esempio di programma in C Programma di test (hello.c) Compilazione del programma gcc –o hello hello.c Esecuzione del programma ./hello #include <stdio.h> int main() { /* Stampa della frase Hello World! */ printf (“Hello World!\n”); /* Uscita dal programma */ return (0); }
Esempio di programma in C (2) Conversione di un numero intero da notazione decimale a notazione ottale (octal.c) Compilazione ed esecuzione del programma gcc –o octal octal.c ./octal #include <stdio.h> int main() { /* definizione delle variabili */ int var1 = 0; /* Leggi il numero intero */ printf ("Inserisci un numero intero:\n"); scanf ("%d", &var1); printf ("Il numero %d in notazione ottale è %o\n", var1, var1); /* Uscita dal programma */ return (0); }
Esempio di programma in C (3) Utilizzo dei parametri di linea di comando (numeri.c) Compilazione ed esecuzione del programma gcc –o numeri numeri.c ./numeri 123 #include <stdio.h> int main(int argc, char **argv) { /* definizione delle variabili */ int var1 = 0; /* Stampa del primo numero immesso nella linea di comando */ if (argc > 1) { var1 = atoi(argv[1]); printf (“Il numero immesso è: %d\n”,var1); } /* Uscita dal programma */ return (0);
Esercitazione (1) Modificare il programma octal.c in modo da stampare il numero intero decimale in notazione esadecimale