Introduzione al modulo, introduzione a Unix - DIR

24/11/15
Programmazione 1:
Sperimentazioni
Luca Anselma
[email protected]
a.a. 2015/2016
Per l’accessibilità di
queste slide è stato usato
Chi è costui?
• Luca Anselma
• Ricercatore presso il Dipartimento di Informatica
dell’Università di Torino
• E-mail: [email protected] (indicare nome,
cognome, matricola e titolo del corso)
• Ricevimento: su appuntamento
1
24/11/15
Materiale didattico
• Queste slide (reperibili su D.I.R. (Moodle))
• Testo consigliato: lo stesso di Programmazione 1:
Fondamenti:
o P. Deitel, H. Deitel, “Il linguaggio C – Fondamenti e
tecniche di programmazione”, Pearson
• In alternativa:
o Kelley, Pohl, “C: didattica e programmazione”, Pearson
o 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: Roberto Nai
• e-mail: [email protected]
2
24/11/15
Obiettivi
• Introdurre alla programmazione con il linguaggio C
• Conoscenze preliminari: Prima parte di
Programmazione 1: Fondamenti
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
3
24/11/15
Esame
• Prova scritta con esercizi di programmazione da
svolgere con carta e penna
• Iscrizione tramite Esse3 www.studenti.uniupo.it
• Il voto finale sarà una media pesata
(6 cfu + 3 cfu) con il voto di Programmazione 1:
Fondamenti, cioè
Voto di Programmazione 1 = (2 * voto di Fondamenti
+ voto di Sperimentazioni) / 3
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)
4
24/11/15
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
• 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
5
24/11/15
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 la 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 in
gran parte da GNU
Cenni storici
6
24/11/15
Sistemi operativi
• Un sistema operativo è un’interfaccia tra l’utente (o
gli applicativi) e l’hardware
Architettura di Linux
7
24/11/15
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 “proprietario” (umano o di
sistema) che ha iniziato la chiamata o esecuzione. Il
proprietario è legato ai permessi associati al
processo
8
24/11/15
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: File system
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.
9
24/11/15
Shell
• La shell è un interprete di comandi che permette
agli utenti di interagire con il sistema operativo
• È il livello del sistema operativo con cui l’utente
può interagire direttamente
• Si usa quasi esclusivamente via linea di comando
impartendo comandi testuali
• Shell più diffuse: Bourne shell (sh), C shell (csh),
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
10
24/11/15
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 o
che può modificare e cancellare
• In Unix si assume che gli utenti root sappiano ciò
che fanno. Quindi si deve usare un account root
solo per lo stretto tempo necessario a svolgere i
compiti più importanti
11
24/11/15
Account di sistema
• Un account di sistema viene usato per lo
svolgimento di operazioni da parte di componenti
del sistema che 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: non può accedere a tutte le risorse del
sistema
12
24/11/15
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
13
24/11/15
Gruppi utente
• 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
possono essere assegnati a:
o Il proprietario del file, noto anche come user (u)
o Il gruppo assegnato al file (g)
o Tutti gli altri (cioè chiunque altro abbia un
account valido sul sistema e non è un proprietario
o non fa parte del gruppo) (others) (o)
14
24/11/15
Permessi
• Il proprietario di un file di solito è l’utente che ha
creato il file
• Il proprietario può decidere chi può accedere al file
e con quale tipo di accesso
Permessi
• Tre tipi di accesso a un file:
o Read (il file può essere letto)
o Write (il file può essere modificato)
o Execute (il file può essere eseguito; notare che, a
differenza che in Windows, un eseguibile può
avere qualunque estensione)
15
24/11/15
Permessi
• Tre tipi di accesso a una directory:
o Read (la directory può essere letta, cioè si
possono elencare i file contenuti)
o Write (la directory può essere modificata, cioè si
possono creare, rinominare e cancellare i file
contenuti)
o Execute (la directory può essere “attraversata”
per accedere ai file contenuti o alle sue
sottodirectory)
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
proprietario dell’eseguibile su cui avrò i diritti di
lettura, scrittura ed esecuzione
16
24/11/15
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 (lettura r, scrittura w,
esecuzione/attraversamento x) per proprietario, gruppo, altri
2
Numero di hard link
root
proprietario del file
root
Gruppo al quale il proprietario appartiene
2012-09-30 09:08
Data e ora di ultima modifica
bin
Nome del file o directory
Come leggere i permessi
(reprise)
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.
17
24/11/15
Shell
• I comandi della shell possono essere programmi a sé
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
Downloads Movies
Pictures
Music
Public
Sites
VirtualBox VMs Desktop
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
hosts.equiv
irbrc
kern_loader.conf ...
php.ini-5.2-previous
php.ini.default
18
24/11/15
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
...
Command
root
root
root
15221 Feb 28 2001 a2ps.cfg
2561 Feb 28 2001 a2ps-site.cfg
47 Dec 28 2001 adjtime
Principali comandi
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
Permette di scorrere il contenuto di un file
ls
List: mostra il contenuto di una directory
man
Manual: permette 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
19
24/11/15
$ ls [options] [directory]
ls
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
Caratteri jolly
• Sono usati per trovare corrispondenze con più file
allo stesso tempo
• ? Corrisponde a esattamente un carattere, che può
essere un carattere qualunque
• * Corrisponde a qualsiasi sequenza di caratteri
• Se la directory contiene
help help1 help2 help12 myprog.c
•
•
•
$ ls help?
$ ls help*
$ ls *.c
elenca
elenca
elenca
help1 help2
help help1 help2 help12
myprog.c
20
24/11/15
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/
•
$
•
•
21
24/11/15
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 (attenzione, è una cancellazione
irrevocabile: non usa il cestino)
22
24/11/15
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” (il “manuale”)
• Es.:
$ man ls
• Stessi tasti di less (in effetti man per default usa
less come pager)
23
24/11/15
chmod
• Cambia i permessi di un file o una directory (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)
• Es.:
$ chmod 754 myfile
chmod
u
g
o
rwx
rwx
rwx
111
101
100
4+2+1=7
4+1=5
4
• Imposta i permessi di myfile in modo che il
proprietario possa leggere, modificare ed eseguire il
file (7), i membri del gruppo possano solo leggere
ed eseguire (5) e gli altri possano solo leggere (4)
24
24/11/15
$ ls -l file1
-rw-r--r-- 2 anselma anselma
chmod
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 >
25
24/11/15
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
• Se il file se esiste già viene sovrascritto
• 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
26
24/11/15
Redirezione dell’input e
dell’output
• Pipe (simbolo |): permette di concatenare comandi
usando l’output di un comando come l’input di un
altro
• 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 usare il multitasking anche con il
terminale
• Quando si lancia un programma, questo gira in
foreground e ha il controllo del terminale
• È possibile interromperne l’esecuzione premendo
Ctrl+C
• È possibile sospenderne l’esecuzione premendo
Ctrl+Z
27
24/11/15
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 n non fa niente per n
secondi)
$ sleep 1000
(Ctrl+Z)
$ bg
[1]+ sleep 100 &
• Un processo che continua a eseguire in background
può scrivere 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, ma un solo job in esecuzione in foreground
• È possibile lanciare un comando direttamente in esecuzione
in background aggiungendo il carattere & al termine del
comando
$ sleep 100 &
28
24/11/15
Processi in background
• Come si fa ad uscire da un job che non risponde perché,
per esempio, è in loop?
1. Se è in foreground, si preme Ctrl+C
2. Si scrive
$ kill %<numero del job>
3. Se il job non termina lo stesso, si può usare
$ kill -9 %<numero del job>
• In alternativa al numero del job, si può usare il PID
(process ID): si ottiene l’elenco dei processi con il
comando ps (process status), si trova il PID e si usa 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
29
24/11/15
Come compilare
• Useremo unicamente il terminale (finestra di comandi) e
il text editor (non useremo un IDE)
• Scriviamo un programma C con il text editor e lo
salviamo con il nome esempio.c
• Lanciamo il compilatore
$ gcc -o esempio esempio.c
•
•
Il compilatore genera un file eseguibile di nome esempio
L’opzione -o di gcc ci permette di assegnare un nome all’eseguibile (il nome
predefinito è a.out)
• Lanciamo l’eseguibile scrivendo il nome del file nel
terminale
$ esempio
• In alcune installazioni è necessario indicare anche la
directory corrente:
$ ./esempio
30