GaPiL
Guida alla Programmazione in Linux

Simone Piccardi

4 marzo 2005

Copyright © 2000-2004 Simone Piccardi. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being “Un preambolo” in “Prefazione”, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License”.

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