10
21/10/14 1 Programmazione 1: Sperimentazioni Luca Anselma [email protected] Dipartimento di Informatica Università degli Studi di Torino a.a. 2014/2015 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 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 Tutoraggio Tutor: Paolo Bonanno e-mail: [email protected] 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 Obie<ivi Introdurre alla programmazione con il linguaggio C Conoscenze preliminari: o Prima parte di Programmazione 1: Fondamenti

Informatica dell’Università di Torino Sperimentazioni

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

1  

Programmazione  1:  Sperimentazioni

Luca Anselma [email protected]

Dipartimento di Informatica Università degli Studi di Torino

a.a. 2014/2015

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

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

Tutoraggio •  Tutor: Paolo Bonanno •  e-mail: [email protected]

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

Obie<ivi •  Introdurre alla programmazione con il linguaggio C •  Conoscenze preliminari:

o  Prima parte di Programmazione 1: Fondamenti

Page 2: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

2  

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

Introduzione  a  Linux

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

Cenni  storici

Page 3: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

3  

Sistemi  operativi •  Un sistema operativo è un’interfaccia tra l’utente (o

gli applicativi) e l’hardware

Archite<ura  di  Linux

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:  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

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

Directory   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.

Kernel:  File  system

Page 4: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

4  

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  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  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  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

Page 5: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

5  

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 •  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

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 •  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 •  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)

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

Page 6: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

6  

Come  leggere  i  permessi

$ 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

I  permessi  vengono  elencati  visualizzando  il  contenuto  di  una  directory  con  il  comando  ls  -­‐‑l

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  create,  modify,  or  remove  files  or  subdirectories.

Grants  write  permissions,  allowing  an  authorized  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 hosts.equiv php.ini-5.2-previous AFP.conf irbrc php.ini.default afpovertcp.cfg kern_loader.conf ...

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 root 15221 Feb 28 2001 a2ps.cfg -rw-r--r-- 1 root root 2561 Feb 28 2001 a2ps-site.cfg -rw-r--r-- 1 root root 47 Dec 28 2001 adjtime ...

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

Page 7: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

7  

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

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/

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)

rm •  Cancella un file (senza usare il cestino)

Page 8: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

8  

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 •  Es.: $ chmod 754 myfile

•  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

111 101 100

rwx rwx rwx

7 5 4

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

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 >

Page 9: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

9  

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

•  < 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

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 •  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 •  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

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 &

Page 10: Informatica dell’Università di Torino Sperimentazioni

21/10/14  

10  

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