21/10/14 Programmazione 1: Sperimentazioni Chi è costui? • Luca Anselma • Ricercatore di Informatica presso il Dipartimento di Informatica dell’Università di Torino • E-mail: [email protected] (indicare nome, cognome, matricola e titolo del corso) • Homepage: http://www.di.unito.it/%7Eanselma • Ricevimento: su appuntamento • NO consulenza via email Luca Anselma [email protected] Dipartimento di Informatica Università degli Studi di Torino a.a. 2014/2015 Materiale dida<ico • Queste slide (reperibili su moodle) • Testo consigliato (per Programmazione 1 e 2): • P. Deitel, H. Deitel, “Il linguaggio C – Fondamenti e tecniche di programmazione”, Pearson • In alternativa: • Kelley, Pohl, “C: didattica e programmazione”, Pearson • Qualunque testo di approfondimento presente in biblioteca • Biblioteca DISUM (biblioteca di Lettere) dell'Università del Piemonte Orientale di Vercelli via G. Ferraris 54 Esame • Prova scritta • Il voto sarà una media pesata (6 cfu + 3 cfu) con il voto di Programmazione 1: Fondamenti • Voto di Programmazione 1 = (2 * voto di Fondamenti + voto di Sperimentazioni) / 3 Tutoraggio • Tutor: Paolo Bonanno • e-mail: [email protected] Obie<ivi • Introdurre alla programmazione con il linguaggio C • Conoscenze preliminari: o Prima parte di Programmazione 1: Fondamenti 1 21/10/14 Programma • • • • • • • • Introduzione a Unix/Linux Approfondimenti di C Approfondimenti sui tipi di dato primitivi, cast Approfondimenti sulle stringhe Aritmetica dei puntatori Approfondimenti sul passaggio dei parametri Strutture Funzioni di I/O e di gestione file Strumenti di lavoro • Un sistema operativo Unix o Unix-like (Linux in qualunque distribuzione (Mint, Ubuntu, Debian…) è perfetto) • Un text editor (ad es. Gedit, gvim, emacs, …) per scrivere i programmi o Per scopi didattici non useremo un IDE (ambiente integrato di sviluppo) • Un compilatore C (ad es. gcc, compreso in ogni installazione di sistemi operativi Unix o Unix-like) Strumenti di lavoro • Per usare Linux sul computer di casa si hanno tre possibilità: o Avvio con una installazione “live” di Linux da CD, DVD o chiavetta USB • È l’alternativa meno “intrusiva” ma più precaria o Installazione di Linux su un computer • In questo caso non si può usare Linux contemporaneamente a Windows o a Mac OS • Maggiore velocità o Virtualizzazione (ad esempio con VirtualBox o VMware player, che sono gratuiti) • Si installa un programma (VirtualBox o VMware) che permette di fare girare Linux all’interno di Windows (o Mac OS) in una “macchina virtuale” • Potrebbe essere lento su computer non recenti Cenni storici Unix nato all’inizio degli anni ’70 Sviluppato da un gruppo di ricercatori dei Bell Laboratories della AT&T Inizialmente scritto in assembly e poi riscritto in C per facilitare portabilità su hardware diversi Nel 1984 Richard Stallman inizia a lavorare al GNU Project con l’obiettivo di creare un sistema operativo simile a Unix e gratuito Nel 1991 Linus Torvalds inizia a lavorare a Linux, che propriamente è solo il kernel del sistema operativo mentre il resto (tool, shell, file system) proviene spesso da GNU Introduzione a Linux Cenni storici 2 21/10/14 Sistemi operativi Archite<ura di Linux • Un sistema operativo è un’interfaccia tra l’utente (o gli applicativi) e l’hardware Kernel • Il kernel è il livello più basso del sistema Unix, cioè quello più vicino all’hardware • Il kernel controlla i processi, le periferiche di input/ output, le operazioni del file system, la memoria • Poiché gestisce task di basso livello, l’utente di solito non ha accesso al kernel Kernel: File system • Il file system permette all’utente di vedere, creare, organizzare e interagire con i dispositivi di memoria secondaria attraverso una strutturazione a file e directory Kernel: Processi • Uno dei compiti più importanti del kernel consiste nella gestione dei processi • I processi sono programmi in esecuzione. In un sistema operativo multitasking come Unix possono essere in esecuzione più processi contemporaneamente; la gestione di questo è affidata al kernel • Un processo ha un possessore (umano o di sistema) che ha iniziato la chiamata o esecuzione. Il possessore è legato ai permessi associati al processo Directory Kernel: File system Content bin/ Common programs, shared by the system, the system administrator and the users. boot/ The startup files and the kernel. dev/ Contains references to all the CPU peripheral hardware. etc/ Most important system configuration files are in /etc, this directory contains data similar to those in the Control Panel in Windows home/ Home directories of the common users. lib/ Library files, includes files for all kinds of programs needed by the system and the users. lost +found/ Every partition has a lost+found in its upper directory. Files that were saved during failures are here. mnt/ Standard mount point for external file systems, e.g. a CD-­‐‑ROM or a digital camera. opt/ Typically contains extra and third party software. root/ The administrative user'ʹs home directory. Mind the difference between /, the root directory and / root, the home directory of the root user. sbin/ Programs for use by the system and the system administrator. tmp/ Temporary space for use by the system, cleaned upon reboot, so don'ʹt use this for saving anything usr/ Programs, libraries, documentation etc. for all user-­‐‑related programs. var/ Storage for all variable files and temporary files created by users, such as log files, the mail queue, the print spooler area, space for temporary storage of files downloaded from the Internet, or to keep an image of a CD before burning it. 3 21/10/14 Shell • La shell è un interprete di comandi che permette agli utenti di interagire con il sistema operativo • La shell è il livello del sistema operativo con cui l’utente può interagire direttamente • La shell si usa quasi esclusivamente via linea di comando impartendo comandi testuali • Tre shell più diffuse: Bourne shell (sh), C shell (csh) e Korn shell (ksh), Bourne Again shell (bash) Shell $ cat /etc/shells # /etc/shells: valid login shells /bin/csh /bin/sh /usr/bin/es /usr/bin/ksh /bin/ksh /usr/bin/rc /usr/bin/tcsh /bin/tcsh /usr/bin/esh /bin/dash /bin/bash /bin/rbash $ echo $SHELL /bin/bash Account • Un account utente permette l’accesso a un sistema Unix, tramite la shell, o ftp o altri mezzi • Per utilizzare le risorse fornite da un sistema Unix dovete avere un account utente e i permessi di accesso a quelle risorse • Tipi di account: o root (o superuser) o account di sistema o account utente Account di sistema • Un account di sistema viene usato per lo svolgimento di operazioni di componenti del sistema. Di solito non usano la shell. Ad esempio se sul sistema gira un web server esisterà un account di sistema per il processo (o i processi) legati al web server Account root • Un account root ha il controllo completo del sistema • Non ci sono restrizioni ai file a cui può accedere, modificare, cancellare • In Unix si assume che gli utenti root sappiano ciò che fanno. Si usa un account root solo per lo stretto tempo necessario a svolgere i compiti più importanti Account utente • Un account utente permette di avere un accesso interattivo (tramite shell) al sistema • Di solito agli utenti viene assegnato un accesso limitato ai file di sistema e alle directory 4 21/10/14 Account $ cat /etc/passwd nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false root:*:0:0:System Administrator:/var/root:/bin/sh daemon:*:1:1:System Services:/var/root:/usr/bin/false _uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico ... Gruppi utente • Per esempio un’azienda di circa 100 impiegati usa un server Unix centrale • Tre impiegati compongono lo staff della gestione delle risorse umane e hanno a che fare con informazioni riservate come stipendi, aumenti, azioni disciplinari. La directory sul server centrale Risorse umane deve essere protetta in modo che solo loro possano vederne il contenuto • Si può creare un gruppo chiamato ru, rendere membri del gruppo i tre impiegati, impostare i permessi sulla directory in modo che solo i membri del gruppo ru possano vedere e modificare i file Permessi • Il possessore di un file di solito è l’utente che ha creato il file • Il possessore può decidere chi può accedere al file e con quale tipo di accesso • Tre tipi di accesso: o Read (il file può essere letto) o Write (il file può essere modificato) o Execute (il file può essere eseguito; se è una directory: la directory può essere attraversata) Gruppi utente • I gruppi utente permettono di definire un insieme logico di utenti e sono utili per semplificare la gestione dei privilegi • Un utente può appartenere a più gruppi Permessi • I permessi di Unix sono posti sui file e directory e rientrano in tre sottoinsiemi: o Il possessore del file, noto anche come user (u) o Il gruppo assegnato al file (g) o Chiunque altro abbia un account valido sul sistema e non è un possessore o non fa parte del gruppo (others) (o) Permessi • Quando si definiscono i permessi, si assegnano i diritti di accesso a ogni categoria (u, g, o) • Per esempio, se scrivo un programma, sarò il possessore dell’eseguibile, su cui avrò i diritti di lettura, scrittura ed esecuzione 5 21/10/14 Come leggere i permessi I permessi vengono elencati visualizzando il contenuto di una directory con il comando ls -­‐‑l $ ls -l /etc drwxr-xr-x 2 root root 4096 2012-09-30 09:08 bin drwxr-­‐‑xr-­‐‑x Tipo del file (file/directory/link) e permessi (le<ura r, scri<ura w, esecuzione file/a<raversamento directory x) per possessore, gruppo, altri 2 Numero di hard link root Possessore del file root Gruppo al quale il possessore appartiene 2012-­‐‑09-­‐‑30 09:08 Data e ora di ultima modifica bin Nome del file o directory Come leggere i permessi Permission Applied to a Directory Applied to Any Other Type of File read (r) Grants the capability to read the contents of the directory or subdirectories. Grants the capability to view the file. write (w) Grants the capability to Grants write permissions, create, modify, or remove allowing an authorized files or subdirectories. entity to modify the file, such as by adding text to a text file, or deleting the file. execute (x) Grants the capability to enter the directory. Allows the user to “run” the program. -­‐‑ No permission. No permission. Shell • I comandi sono programmi eseguibili. Possono essere programmi a se stanti oppure essere integrati nella shell • Un comando può essere diviso in due parti: il comando stesso e gli argomenti. • Per esempio, ls permette di visualizzare il contenuto di una directory $ ls Applications Documents Library Music Public Sites VirtualBox VMs Desktop Downloads Movies Pictures Shell • Gli argomenti permettono di influenzare il comportamento del comando • Per esempio visualizzo il contenuto della directory /etc $ ls /etc 6to4.conf AFP.conf afpovertcp.cfg Shell • I flag di solito (ma non sempre) sono preceduti da un trattino • Per esempio visualizzo il contenuto della directory /etc in formato lungo $ ls -l /etc total 1780 -rw-r--r-- 1 root -rw-r--r-- 1 root -rw-r--r-- 1 root ... root root root 15221 2561 47 Feb 28 2001 a2ps.cfg Feb 28 2001 a2ps-site.cfg Dec 28 2001 adjtime hosts.equiv irbrc kern_loader.conf php.ini-5.2-previous php.ini.default ... Principali comandi Command Description cat Concatenate: mostra il contenuto di un file cd Change directory: cambia la directory corrente cp Copy: copia un file/directory find Trova un file/directory head Mostra l’inizio di un file less Perme<e di scorrere il contenuto di un file ls List: mostra il contenuto di una directory man Manual: perme<e di accedere al manuale in linea dei comandi Unix/C mkdir Make directory: crea una directory mv Move: sposta un file o lo rinomina pwd Print working directory: mostra qual è la directory corrente rm Remove: cancella un file tail Mostra la fine di un file 6 21/10/14 ls $ ls [options] [directory] option function -­‐‑l Lists directory contents in long format, which shows individual file size, per-­‐‑ missions, and other data. -­‐‑t Lists directory contents sorted by the timestamp (time of the last modification) -­‐‑a Lists all directory contents, including hidden files whose name begins with the . character -­‐‑R Lists directory contents including all subdirectories and their contents Cara<eri jolly • Sono usati per trovare corrispondenza con più file allo stesso tempo • ? Corrisponde a esattamente un carattere, che può essere qualunque • * Corrisponde a qualsiasi sequenza di caratteri • Se la directory contiene help help1 help2 myprog.c • $ ls help? dà help1 help2 • $ ls help* dà help help1 help2 • $ ls *.c dà myprog.c cd • Cambia la directory corrente $ cd directory $ cd .. o Si sposta alla directory genitore $ cd o Si sposta alla directory home cp • Copia un file $ cp old new • old è il file da copiare in new (new può essere una directory o il nome da dare alla copia del file) mv Sposta un file (o lo rinomina) mv old new old è il file da spostare in new Se new consiste solo in un nome di file, old viene rinominato (e rimane nella directory corrente) $ mv file.txt nuovonome.txt • Se new è una directory, old viene spostato in new (e non cambia nome) $ mv file.txt testi/ • $ • • rm • Cancella un file (senza usare il cestino) 7 21/10/14 less Permette di visualizzare un file “a pagine” Barra spaziatrice per andare avanti di una pagina b per tornare indietro di una pagina q per uscire /stringa per cercare il testo “stringa” (poi n e N per muoversi avanti/indietro tra le occorrenze) • h per l’help • • • • • man • Permette di accedere all’”help” (manuale • Es.: $ man ls • Stessi tasti di less (in effetti man per default usa less come pager) chmod • Cambia i permessi di un file (change mode) $ chmod [permessi] file • Usa tre cifre per rappresentare i permessi (rispettivamente per il proprietario, il gruppo e gli altri) • Ogni cifra rappresenta i permessi di lettura, scrittura ed esecuzione come maschera di bit (si considerano r=4, w=2, x=1 e si sommano i permessi attivi) chmod $ ls -l file1 -rw-r--r-- 2 anselma anselma 6 2014-09-03 13:56 file1 $ chmod 700 file1 $ ls -l file1 -rwx------ 2 anselma anselma 6 2014-09-03 13:56 file1 $ chmod 703 file1 $ ls -l file1 -rwx----wx 2 anselma anselma 6 2014-09-03 13:56 file1 $ chmod 701 file1 $ ls -l file1 -rwx-----x 2 anselma anselma 6 2014-09-03 13:56 file1 chmod • Es.: $ chmod 754 myfile 111 101 100 rwx rwx rwx 7 5 4 • Imposta i permessi di myfile in modo che il proprietario possa leggere, modificare ed eseguire, i membri del gruppo possano solo leggere ed eseguire e gli altri possano solo leggere Redirezione dell’input e dell’output • In un’interfaccia a caratteri lo standard input di un programma corrisponde alla tastiera e lo standard output allo schermo • La redirezione permette di forzare un programma ad accettare l’input da una fonte diversa e di mandare l’output verso una destinazione diversa • Si usano i caratteri < e > 8 21/10/14 Redirezione dell’input e dell’output • > redireziona l’output • Es. ls > output_di_ls.txt • crea un file output_di_ls.txt che contiene ciò che normalmente sarebbe stato visualizzato sullo schermo • > sovrascrive il file se esiste già • Se si vuole preservare il contenuto preesistente, si può usare >> che aggiunge il nuovo contenuto in coda Redirezione dell’input e dell’output • Pipe: permette di concatenare comandi usando l’output di un comando come l’input di un altro • Simbolo | • Es. $ ls -la | less • L’output di ls diventa l’input di less, e il contenuto della directory viene visualizzato una pagina per volta Processi in background • Dopo avere sospeso un processo, è possibile fare in modo che continui a eseguire in background usando il comando bg • Es. (il comando sleep non fa niente per n secondi) $ sleep 1000 (Ctrl+Z) $ bg [1]+ sleep 100 & • Il processo continua a eseguire in background e scrive l’output su schermo ma non può accettare input da tastiera Redirezione dell’input e dell’output • < redireziona l’input • Es. $ sort < parole.txt • Invoca il comando sort, che ordina alfabeticamente linee di testo, prendendo l’input dal file parole.txt • < e > si possono combinare • Es. $ sort < parole.txt > parole_ordinate.txt Processi in background • Lo Unix è un sistema operativo multitasking, cioè permette di avere più programmi in esecuzione contemporaneamente (processi) • È possibile farlo anche sul terminale • Quando si lancia un programma, quello gira in foreground e ha il controllo del terminale • È possibile interromperne l’esecuzione premendo Ctrl+C • È possibile sospenderne l’esecuzione premendo Ctrl +Z Processi in background • Le unità esecutive sono job • Job: sequenza di processi connessi da pipe $ comando1 | comando2 | … | comandon • Con il comando jobs si ha l’elenco dei job • Per riprendere l’esecuzione in foreground si usa il comando fg [numero del job] • Si possono avere più job in esecuzione in background, più job sospesi, un solo job in esecuzione in foreground • È possibile lanciare un comando direttamente in esecuzione in background con & al termine del comando $ sleep 100 & 9 21/10/14 Processi in background • Per terminare un job lo si può riportare in foreground e poi premere Ctrl+C oppure si può usare $ kill %<numero del job> • Se il job non termina lo stesso, si può usare $ kill -9 %<numero del job> • In alternativa, si può ricavare l’elenco dei processi con il comando ps (process status), trovare il PID (process ID) e usare il PID nella kill $ kill 1234 Come lavoreremo 1. Usando un text editor creeremo o modificheremo un file di testo contente il sorgente del programma C 2. Compileremo il programma usando gcc 3. In caso di errori/warning segnalati da gcc (errori di sintassi) ritorneremo al passo 1 4. Eseguiremo il programma 5. In caso di errori di esecuzione torneremo al passo 1 6. Per interrompere l’esecuzione del programma, premeremo Ctrl+C Come compilare • Useremo unicamente il terminale (finestra di comandi) e il text editor • Scriviamo un programma C con il text editor e lo salviamo con il nome esempio.c • Lanciamo il compilatore $ gcc esempio.c -o esempio • Il compilatore genera un file eseguibile di nome esempio • Lanciamo l’eseguibile scrivendo il nome del file nel terminale $ esempio • In alcune installazioni è necessario indicare anche la directory: $ ./esempio 10