A cura di GIUSEPPE CIABURRO
Pubblicato il 23/05/2007
A cura di Simone Piccardi
Indice
Un preambolo
Prefazione
I Programmazione di sistema
1 L'architettura del sistema
1.1 Una panoramica
1.1.1
Concetti base
1.1.2 User space e kernel space
1.1.3 Il
kernel e il sistema
1.1.4 Chiamate al sistema e librerie di funzioni
1.1.5 Un sistema multiutente
1.2 Gli standard
1.2.1 Lo standard ANSI C
1.2.2 I tipi di dati primitivi
1.2.3 Lo standard IEEE – POSIX
1.2.4 Lo standard X/Open – XPG3
1.2.5 Gli standard Unix – Open Group
1.2.6 Lo “standard”
BSD
1.2.7 Lo standard System V
1.2.8 Il comportamento
standard del gcc e delle glibc
2 L'interfaccia base con i processi
2.1 Esecuzione e conclusione di un programma
2.1.1 La
funzione main
2.1.2 Come chiudere un programma
2.1.3 Le
funzioni exit e _exit
2.1.4 Le funzioni atexit e on_exit
2.1.5 Conclusioni
2.2 I processi e l'uso della memoria
2.2.1 I concetti generali
2.2.2 La struttura della memoria di un
processo
2.2.3 Allocazione della memoria per i programmi C
2.2.4 Le funzioni malloc, calloc, realloc e free
2.2.5 La funzione
alloca
2.2.6 Le funzioni brk e sbrk
2.2.7 Il controllo
della memoria virtuale
2.3 Argomenti, opzioni ed ambiente di un
processo
2.3.1 Il formato degli argomenti
2.3.2 La
gestione delle opzioni
2.3.3 Opzioni in formato esteso
2.3.4 Le variabili di ambiente
2.4 Problematiche di programmazione
generica
2.4.1 Il passaggio delle variabili e dei valori di ritorno
2.4.2 Il passaggio di un numero variabile di argomenti
2.4.3 Potenziali problemi con le variabili automatiche
2.4.4 Il
controllo di flusso non locale
3 La gestione dei processi
3.1
Introduzione
3.1.1 L'architettura della gestione dei processi
3.1.2 Una panoramica sulle funzioni fondamentali
3.2 Le
funzioni di base
3.2.1 Gli identificatori dei processi
3.2.2 La funzione fork
3.2.3 La funzione vfork
3.2.4 La
conclusione di un processo.
3.2.5 Le funzioni wait e waitpid
3.2.6 Le funzioni wait3 e wait4
3.2.7 Le funzioni exec
3.3 Il controllo di accesso
3.3.1 Gli identificatori del
controllo di accesso
3.3.2 Le funzioni setuid e setgid
3.3.3 Le funzioni setreuid e setregid
3.3.4 Le funzioni seteuid e
setegid
3.3.5 Le funzioni setresuid e setresgid
3.3.6 Le
funzioni setfsuid e setfsgid
3.3.7 Le funzioni setgroups e getgroups
3.4 La gestione della priorità di esecuzione
3.4.1 I
meccanismi di scheduling
3.4.2 Il meccanismo di scheduling standard
3.4.3 Il meccanismo di scheduling real-time
3.5
Problematiche di programmazione multitasking
3.5.1 Le operazioni
atomiche
3.5.2 Le race condition ed i deadlock
3.5.3 Le
funzioni rientranti
4 L'architettura dei file
4.1 L'architettura
generale
4.1.1 L'organizzazione di file e directory
4.1.2
I tipi di file
4.1.3 Le due interfacce ai file
4.2
L'architettura della gestione dei file
4.2.1 Il Virtual File System
di Linux
4.2.2 Il funzionamento del Virtual File System
4.2.3 Il funzionamento di un filesystem Unix
4.2.4 Il filesystem ext2
5 File e directory
5.1 La gestione di file e directory
5.1.1 Le funzioni link e unlink
5.1.2 Le funzioni remove e rename
5.1.3 I link simbolici
5.1.4 La creazione e la
cancellazione delle directory
5.1.5 La creazione di file speciali
5.1.6 Accesso alle directory
5.1.7 La directory di lavoro
5.1.8 I file temporanei
5.2 La manipolazione delle
caratteristiche dei files
5.2.1 Le funzioni stat, fstat e lstat
5.2.2 I tipi di file
5.2.3 Le dimensioni dei file
5.2.4 I tempi dei file
5.2.5 La funzione utime
5.3 Il controllo di accesso ai file
5.3.1 I permessi per
l'accesso ai file
5.3.2 I bit suid e sgid
5.3.3 Il bit
sticky
5.3.4 La titolarità di nuovi file e directory
5.3.5
La funzione access
5.3.6 Le funzioni chmod e fchmod
5.3.7
La funzione umask
5.3.8 Le funzioni chown, fchown e lchown
5.3.9 Un quadro d'insieme sui permessi
5.3.10 La funzione chroot
6 I file: l'interfaccia standard Unix
6.1 L'architettura di base
6.1.1 L'architettura dei file descriptor
6.1.2 I file
standard
6.2 Le funzioni base
6.2.1 La funzione open
6.2.2 La funzione close
6.2.3 La funzione lseek
6.2.4 La funzione read
6.2.5 La funzione write
6.3
Caratteristiche avanzate
6.3.1 La condivisione dei files
6.3.2 Operazioni atomiche con i file
6.3.3 La funzioni sync e fsync
6.3.4 La funzioni dup e dup2
6.3.5 La funzione fcntl
6.3.6 La funzione ioctl
7 I file: l'interfaccia standard ANSI C
7.1 Introduzione
7.1.1 I file stream
7.1.2 Gli
oggetti FILE
7.1.3 Gli stream standard
7.1.4 Le modalità
di bufferizzazione
7.2 Funzioni base
7.2.1 Apertura e
chiusura di uno stream
7.2.2 Lettura e scrittura su uno stream
7.2.3 Input/output binario
7.2.4 Input/output a caratteri
7.2.5 Input/output di linea
7.2.6 L'input/output
formattato
7.2.7 Posizionamento su uno stream
7.3 Funzioni
avanzate
7.3.1 Le funzioni di controllo
7.3.2 Il controllo
della bufferizzazione
7.3.3 Gli stream e i thread
8 La gestione
del sistema, del tempo e degli errori
8.1 Capacità e caratteristiche
del sistema
8.1.1 Limiti e parametri di sistema
8.1.2 La
funzione sysconf
8.1.3 I limiti dei file
8.1.4 La funzione
pathconf
8.1.5 La funzione uname
8.2 Opzioni e
configurazione del sistema
8.2.1 La funzione sysctl ed il filesystem
/proc
8.2.2 La gestione delle proprietà dei filesystem
8.2.3 La gestione delle informazioni su utenti e gruppi
8.2.4 Il
registro della contabilità degli utenti
8.3 Limitazione ed uso delle
risorse
8.3.1 L'uso delle risorse
8.3.2 Limiti sulle
risorse
8.3.3 Le risorse di memoria e processore
8.4 La
gestione dei tempi del sistema
8.4.1 La misura del tempo in Unix
8.4.2 La gestione del process time
8.4.3 Le funzioni per
il calendar time
8.4.4 La gestione delle date.
8.5 La
gestione degli errori
8.5.1 La variabile errno
8.5.2 Le
funzioni strerror e perror
8.5.3 Alcune estensioni GNU
9 I
segnali
9.1 Introduzione
9.1.1 I concetti base
9.1.2 Le semantiche del funzionamento dei segnali
9.1.3 Tipi di
segnali
9.1.4 La notifica dei segnali
9.2 La
classificazione dei segnali
9.2.1 I segnali standard
9.2.2
Segnali di errore di programma
9.2.3 I segnali di terminazione
9.2.4 I segnali di allarme
9.2.5 I segnali di I/O
asincrono
9.2.6 I segnali per il controllo di sessione
9.2.7 I segnali di operazioni errate
9.2.8 Ulteriori segnali
9.2.9 Le funzioni strsignal e psignal
9.3 La gestione dei
segnali
9.3.1 Il comportamento generale del sistema.
9.3.2
La funzione signal
9.3.3 Le funzioni kill e raise
9.3.4 Le
funzioni alarm e abort
9.3.5 Le funzioni di pausa e attesa
9.3.6 Un esempio elementare
9.4 Gestione avanzata
9.4.1
Alcune problematiche aperte
9.4.2 Gli insiemi di segnali o signal set
9.4.3 La funzione sigaction
9.4.4 La gestione della
maschera dei segnali o signal mask
9.4.5 Ulteriori funzioni di
gestione
9.4.6 I segnali real-time
10 Terminali e sessioni di
lavoro
10.1 Il job control
10.1.1 Una panoramica
introduttiva
10.1.2 I process group e le sessioni
10.1.3
Il terminale di controllo e il controllo di sessione
10.1.4 Dal login
alla shell
10.1.5 Prescrizioni per un programma daemon
10.2
L'I/O su terminale
10.2.1 L'architettura
10.2.2 La
gestione delle caratteristiche di un terminale
10.2.3 La gestione
della disciplina di linea.
10.2.4 Operare in modo non canonico
10.3 La gestione dei terminali virtuali
10.3.1 I terminali
virtuali
10.3.2 La funzione openpty
11 La gestione avanzata dei
file
11.1 L'I/O multiplexing
11.1.1 La problematica
dell'I/O multiplexing
11.1.2 Le funzioni select e pselect
11.1.3 La funzione poll
11.2 L'accesso asincrono ai file
11.2.1 Operazioni asincrone sui file
11.2.2 L'interfaccia POSIX per
l'I/O asincrono
11.3 Altre modalità di I/O avanzato
11.3.1
I/O vettorizzato
11.3.2 File mappati in memoria
11.4 Il
file locking
11.4.1 L'advisory locking
11.4.2 La funzione
flock
11.4.3 Il file locking POSIX
11.4.4 La funzione
lockf
11.4.5 Il mandatory locking
12 La comunicazione fra
processi
12.1 La comunicazione fra processi tradizionale
12.1.1 Le pipe standard
12.1.2 Un esempio dell'uso delle pipe
12.1.3 Le funzioni popen e pclose
12.1.4 Le pipe con nome,
o fifo
12.1.5 La funzione socketpair
12.2 Il sistema di
comunicazione fra processi di System V
12.2.1 Considerazioni generali
12.2.2 Il controllo di accesso
12.2.3 Gli identificatori
ed il loro utilizzo
12.2.4 Code di messaggi
12.2.5
Semafori
12.2.6 Memoria condivisa
12.3 Tecniche alternative
12.3.1 Alternative alle code di messaggi
12.3.2 I file di
lock
12.3.3 La sincronizzazione con il file locking
12.3.4
Il memory mapping anonimo
12.4 Il sistema di comunicazione fra
processi di POSIX
12.4.1 Considerazioni generali
12.4.2
Code di messaggi
12.4.3 Semafori
12.4.4 Memoria condivisa
II Programmazione di rete
13 Introduzione alla programmazione di
rete
13.1 Modelli di programmazione
13.1.1 Il modello
client-server
13.1.2 Il modello peer-to-peer
13.1.3 Il
modello three-tier
13.2 I protocolli di rete
13.2.1 Il
modello ISO/OSI
13.2.2 Il modello TCP/IP (o DoD)
13.2.3
Criteri generali dell'architettura del TCP/IP
13.3 Il protocollo
TCP/IP
13.3.1 Il quadro generale
13.3.2 Internet Protocol
(IP)
13.3.3 User Datagram Protocol (UDP)
13.3.4 Transport
Control Protocol (TCP)
13.3.5 Limiti e dimensioni riguardanti la
trasmissione dei dati
14 Introduzione ai socket
14.1 Una
panoramica
14.1.1 I socket
14.1.2 Concetti base
14.2 La creazione di un socket
14.2.1 La funzione socket
14.2.2 Il dominio, o protocol family
14.2.3 Il tipo, o
stile
14.3 Le strutture degli indirizzi dei socket
14.3.1
La struttura generica
14.3.2 La struttura degli indirizzi IPv4
14.3.3 La struttura degli indirizzi IPv6
14.3.4 La
struttura degli indirizzi locali
14.3.5 La struttura degli indirizzi
AppleTalk
14.3.6 La struttura degli indirizzi dei packet socket
14.4 Le funzioni di conversione degli indirizzi
14.4.1 La
endianess
14.4.2 Le funzioni per il riordinamento
14.4.3
Le funzioni inet_aton, inet_addr e inet_ntoa
14.4.4 Le funzioni
inet_pton e inet_ntop
15 I socket TCP
15.1 Il funzionamento di una
connessione TCP
15.1.1 La creazione della connessione: il three way
handshake
15.1.2 Le opzioni TCP.
15.1.3 La terminazione
della connessione
15.1.4 Un esempio di connessione
15.1.5
Lo stato TIME_WAIT
15.1.6 I numeri di porta
15.1.7 Le
porte ed il modello client/server
15.2 Le funzioni di base per la
gestione dei socket
15.2.1 La funzione bind
15.2.2 La
funzione connect
15.2.3 La funzione listen
15.2.4 La
funzione accept
15.2.5 Le funzioni getsockname e getpeername
15.2.6 La funzione close
15.3 Un esempio elementare: il
servizio daytime
15.3.1 Il comportamento delle funzioni di I/O
15.3.2 Il client daytime
15.3.3 Un server daytime
iterativo
15.3.4 Un server daytime concorrente
15.4 Un
esempio più completo: il servizio echo
15.4.1 Il servizio echo
15.4.2 Il client echo: prima versione
15.4.3 Il server
echo: prima versione
15.4.4 L'avvio e il funzionamento normale
15.4.5 La conclusione normale
15.4.6 La gestione dei
processi figli
15.5 I vari scenari critici
15.5.1 La
terminazione precoce della connessione
15.5.2 La terminazione precoce
del server
15.5.3 Altri scenari di terminazione della connessione
15.6 L'uso dell'I/O multiplexing
15.6.1 Il comportamento
della funzione select con i socket.
15.6.2 Un esempio di I/O
multiplexing
15.6.3 La funzione shutdown
15.6.4 Un server
basato sull'I/O multiplexing
15.6.5 I/O multiplexing con poll
16
La gestione dei socket
16.1 La risoluzione dei nomi
16.1.1
La struttura del resolver
16.1.2 Le funzioni di interrogazione del
resolver
16.1.3 La risoluzione dei nomi a dominio
16.1.4
Le funzioni avanzate per la risoluzione dei nomi
16.2 Le opzioni dei
socket
16.2.1 Le funzioni setsockopt e getsockopt
16.2.2
Le opzioni generiche
16.3 Altre funzioni di controllo
16.3.1 L'uso di fcntl per i socket
16.3.2 L'uso di ioctl per i socket
16.3.3 L'uso di sysctl per le proprietà della rete
17 Gli altri
tipi di socket
17.1 I socket UDP
17.1.1 Le caratteristiche
di un socket UDP
17.1.2 Le funzioni sendto e recvfrom
17.1.3 Un client UDP elementare
17.1.4 Un server UDP elementare
17.1.5 Le problematiche dei socket UDP
17.1.6 L'uso della
funzione connect con i socket UDP
17.2 I socket Unix domain
17.3 Altri socket
18 Socket avanzati
18.1 Le funzioni di
I/O avanzate
18.1.1 I dati out-of-band
18.2 L'uso dell'I/O
non bloccante
III Appendici
A Il livello di rete
A.1 Il
protocollo IP
A.1.1 Introduzione
A.2 Il protocollo IPv6
A.2.1 I motivi della transizione
A.2.2 Principali
caratteristiche di IPv6
A.2.3 L'intestazione di IPv6
A.2.4
Gli indirizzi di IPv6
A.2.5 La notazione
A.2.6 La
architettura degli indirizzi di IPv6
A.2.7 Indirizzi unicast
provider-based
A.2.8 Indirizzi ad uso locale
A.2.9
Indirizzi riservati
A.2.10 Multicasting
A.2.11 Indirizzi
anycast
A.2.12 Le estensioni
A.2.13 Qualità di servizio
A.2.14 Etichette di flusso
A.2.15 Priorità
A.2.16 Sicurezza a livello IP
A.2.17 Autenticazione
A.2.18
Riservatezza
A.2.19 Autoconfigurazione
A.2.20
Autoconfigurazione stateless
A.2.21 Autoconfigurazione stateful
B
Il livello di trasporto
B.1 Il protocollo TCP
B.1.1 Gli
stati del TCP
B.2 Il protocollo UDP
C I codici di errore
C.1 Gli errori dei file
C.2 Gli errori dei processi
C.3 Gli errori di rete
C.4 Errori generici
C.5
Errori del kernel
D Ringraziamenti
E GNU Free Documentation License
Preamble
E.1 Applicability and Definitions
E.2
Verbatim Copying
E.3 Copying in Quantity
E.4 Modifications
E.5 Combining Documents
E.6 Collections of Documents
E.7 Aggregation With Independent Works
E.8 Translation
E.9 Termination
E.10 Future Revisions of This License
Indice analitico
PER CONSULTARE IL MANUALE CLICCARE SUL LINK SEGUENTE:
Guida alla Programmazione in Linux