GaPiL Guida alla Programmazione in Linux Simone Piccardi 13 dicembre 2011 ii Copyright (cid:13)c 2000-2009 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 xiii Prefazione xv I Programmazione di sistema 1 1 L’architettura del sistema 3 1.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 Concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.2 Il kernel e il sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.3 Chiamate al sistema e librerie di funzioni . . . . . . . . . . . . . . . . . . 5 1.1.4 Un sistema multiutente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.2 Gli standard. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.1 Lo standard ANSI C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.2 I tipi di dati primitivi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2.3 Lo standard System V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.4 Lo“standard”BSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2.5 Gli standard IEEE – POSIX . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.2.6 Gli standard X/Open – Opengroup – Unix . . . . . . . . . . . . . . . . . 12 1.2.7 Il controllo di aderenza agli standard . . . . . . . . . . . . . . . . . . . . . 13 2 L’interfaccia base con i processi 19 2.1 Esecuzione e conclusione di un programma . . . . . . . . . . . . . . . . . . . . . 19 2.1.1 La funzione main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.2 Come chiudere un programma . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.3 Le funzioni exit e _exit . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.4 Le funzioni atexit e on_exit . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.1.5 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2 I processi e l’uso della memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.1 I concetti generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.2.2 La struttura della memoria di un processo . . . . . . . . . . . . . . . . . . 23 2.2.3 Allocazione della memoria per i programmi C . . . . . . . . . . . . . . . . 25 2.2.4 Il controllo della memoria virtuale . . . . . . . . . . . . . . . . . . . . . . 29 2.2.5 Gestione avanzata dell’allocazione della memoria . . . . . . . . . . . . . . 32 2.3 Argomenti, ambiente ed altre propriet`a di un processo . . . . . . . . . . . . . . . 34 2.3.1 Il formato degli argomenti . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.3.2 La gestione delle opzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.3.3 Le variabili di ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.3.4 La localizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 iii iv INDICE 2.4 Problematiche di programmazione generica . . . . . . . . . . . . . . . . . . . . . 40 2.4.1 Il passaggio delle variabili e dei valori di ritorno . . . . . . . . . . . . . . . 40 2.4.2 Il passaggio di un numero variabile di argomenti . . . . . . . . . . . . . . 41 2.4.3 Potenziali problemi con le variabili automatiche . . . . . . . . . . . . . . . 43 2.4.4 Il controllo di flusso non locale . . . . . . . . . . . . . . . . . . . . . . . . 43 2.4.5 La endianess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3 La gestione dei processi 47 3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.1.1 L’architettura della gestione dei processi . . . . . . . . . . . . . . . . . . . 47 3.1.2 Una panoramica sulle funzioni fondamentali . . . . . . . . . . . . . . . . . 49 3.2 Le funzioni di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2.1 Gli identificatori dei processi . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2.2 La funzione fork e le funzioni di creazione dei processi . . . . . . . . . . . 51 3.2.3 La conclusione di un processo . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.2.4 Le funzioni di attesa e ricezione degli stati di uscita . . . . . . . . . . . . 59 3.2.5 La funzione exec e le funzioni di esecuzione dei programmi . . . . . . . . 64 3.3 Il controllo di accesso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.3.1 Gli identificatori del controllo di accesso . . . . . . . . . . . . . . . . . . . 68 3.3.2 Le funzioni di gestione degli identificatori dei processi . . . . . . . . . . . 70 3.3.3 Le funzioni per la gestione dei gruppi associati a un processo . . . . . . . 73 3.4 La gestione della priorit`a dei processi . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.4.1 I meccanismi di scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.4.2 Il meccanismo di scheduling standard . . . . . . . . . . . . . . . . . . . . 76 3.4.3 Il meccanismo di scheduling real-time . . . . . . . . . . . . . . . . . . . . 79 3.4.4 Il controllo dello scheduler per i sistemi multiprocessore . . . . . . . . . . 83 3.4.5 Le priorit`a per le operazioni di I/O . . . . . . . . . . . . . . . . . . . . . . 85 3.5 Funzioni di gestione avanzata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 3.5.1 La system call clone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 3.5.2 La funzione prctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 3.5.3 La funzione ptrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.5.4 L’accesso alle porte di I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.6 Problematiche di programmazione multitasking . . . . . . . . . . . . . . . . . . . 94 3.6.1 Le operazioni atomiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.6.2 Le race condition ed i deadlock . . . . . . . . . . . . . . . . . . . . . . . . 95 3.6.3 Le funzioni rientranti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 4 L’architettura dei file 97 4.1 L’architettura generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 4.1.1 L’organizzazione di file e directory . . . . . . . . . . . . . . . . . . . . . . 97 4.1.2 I tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 4.1.3 Le due interfacce ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 4.2 L’architettura della gestione dei file . . . . . . . . . . . . . . . . . . . . . . . . . . 100 4.2.1 Il Virtual File System di Linux . . . . . . . . . . . . . . . . . . . . . . . . 100 4.2.2 Il funzionamento del Virtual File System . . . . . . . . . . . . . . . . . . 102 4.2.3 Il funzionamento di un filesystem Unix . . . . . . . . . . . . . . . . . . . . 103 4.2.4 I filesystem di uso comune . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 INDICE v 5 File e directory 109 5.1 La gestione di file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.1.1 Le funzioni link e unlink . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.1.2 Le funzioni remove e rename . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.1.3 I link simbolici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 5.1.4 La creazione e la cancellazione delle directory . . . . . . . . . . . . . . . . 116 5.1.5 La creazione di file speciali . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5.1.6 Accesso alle directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 5.1.7 La directory di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.1.8 I file temporanei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 5.2 La manipolazione delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 129 5.2.1 La lettura delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 130 5.2.2 I tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 5.2.3 Le dimensioni dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.2.4 I tempi dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 5.3 Il controllo di accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 5.3.1 I permessi per l’accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . 137 5.3.2 I bit dei permessi speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 5.3.3 Le funzioni per la gestione dei permessi dei file . . . . . . . . . . . . . . . 141 5.3.4 La gestione della titolarit`a dei file . . . . . . . . . . . . . . . . . . . . . . 144 5.3.5 Un quadro d’insieme sui permessi . . . . . . . . . . . . . . . . . . . . . . . 145 5.4 Caratteristiche e funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . 146 5.4.1 Gli attributi estesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 5.4.2 Le Access Control List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 5.4.3 La gestione delle quote disco . . . . . . . . . . . . . . . . . . . . . . . . . 160 5.4.4 La gestione delle capabilities . . . . . . . . . . . . . . . . . . . . . . . . . 165 5.4.5 La funzione chroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 6 I file: l’interfaccia standard Unix 181 6.1 L’architettura di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 6.1.1 L’architettura dei file descriptor . . . . . . . . . . . . . . . . . . . . . . . 181 6.1.2 I file standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 6.2 Le funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 6.2.1 La funzione open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 6.2.2 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 6.2.3 La funzione lseek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 6.2.4 Le funzioni read e pread . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 6.2.5 Le funzioni write e pwrite . . . . . . . . . . . . . . . . . . . . . . . . . . 189 6.3 Caratteristiche avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 6.3.1 La condivisione dei files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 6.3.2 Operazioni atomiche con i file . . . . . . . . . . . . . . . . . . . . . . . . . 191 6.3.3 Le funzioni sync e fsync . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 6.3.4 Le funzioni dup e dup2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 6.3.5 Le funzioni openat, mkdirat e affini . . . . . . . . . . . . . . . . . . . . . 195 6.3.6 La funzione fcntl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 6.3.7 La funzione ioctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 vi INDICE 7 I file: l’interfaccia standard ANSI C 203 7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 7.1.1 I file stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 7.1.2 Gli oggetti FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 7.1.3 Gli stream standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 7.1.4 Le modalit`a di bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . . 204 7.2 Funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 7.2.1 Apertura e chiusura di uno stream . . . . . . . . . . . . . . . . . . . . . . 206 7.2.2 Lettura e scrittura su uno stream . . . . . . . . . . . . . . . . . . . . . . . 208 7.2.3 Input/output binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 7.2.4 Input/output a caratteri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 7.2.5 Input/output di linea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 7.2.6 L’input/output formattato . . . . . . . . . . . . . . . . . . . . . . . . . . 214 7.2.7 Posizionamento su uno stream . . . . . . . . . . . . . . . . . . . . . . . . 218 7.3 Funzioni avanzate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 7.3.1 Le funzioni di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 7.3.2 Il controllo della bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . 220 7.3.3 Gli stream e i thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 8 La gestione del sistema, del tempo e degli errori 225 8.1 Capacit`a e caratteristiche del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 225 8.1.1 Limiti e parametri di sistema . . . . . . . . . . . . . . . . . . . . . . . . . 225 8.1.2 La funzione sysconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 8.1.3 I limiti dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 8.1.4 La funzione pathconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 8.1.5 La funzione uname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 8.2 Opzioni e configurazione del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 231 8.2.1 La funzione sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . 231 8.2.2 La gestione delle propriet`a dei filesystem . . . . . . . . . . . . . . . . . . . 233 8.2.3 La gestione delle informazioni su utenti e gruppi . . . . . . . . . . . . . . 236 8.2.4 Il registro della contabilit`a degli utenti . . . . . . . . . . . . . . . . . . . . 239 8.3 Il controllo dell’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 8.3.1 L’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 8.3.2 Limiti sulle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 8.3.3 Le risorse di memoria e processore . . . . . . . . . . . . . . . . . . . . . . 244 8.3.4 La contabilit`a in stile BSD . . . . . . . . . . . . . . . . . . . . . . . . . . 246 8.4 La gestione dei tempi del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 8.4.1 La misura del tempo in Unix . . . . . . . . . . . . . . . . . . . . . . . . . 247 8.4.2 La gestione del process time . . . . . . . . . . . . . . . . . . . . . . . . . . 248 8.4.3 Le funzioni per il calendar time . . . . . . . . . . . . . . . . . . . . . . . . 249 8.4.4 La gestione delle date. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 8.5 La gestione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 8.5.1 La variabile errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 8.5.2 Le funzioni strerror e perror . . . . . . . . . . . . . . . . . . . . . . . . 255 8.5.3 Alcune estensioni GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 9 I segnali 259 9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 9.1.1 I concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 9.1.2 Le semantiche del funzionamento dei segnali . . . . . . . . . . . . . . . . 260 9.1.3 Tipi di segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 INDICE vii 9.1.4 La notifica dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 9.2 La classificazione dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 9.2.1 I segnali standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 9.2.2 Segnali di errore di programma . . . . . . . . . . . . . . . . . . . . . . . . 263 9.2.3 I segnali di terminazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 9.2.4 I segnali di allarme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 9.2.5 I segnali di I/O asincrono . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 9.2.6 I segnali per il controllo di sessione . . . . . . . . . . . . . . . . . . . . . . 267 9.2.7 I segnali di operazioni errate . . . . . . . . . . . . . . . . . . . . . . . . . 267 9.2.8 Ulteriori segnali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 9.2.9 Le funzioni strsignal e psignal . . . . . . . . . . . . . . . . . . . . . . . 268 9.3 La gestione di base dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 9.3.1 Il comportamento generale del sistema . . . . . . . . . . . . . . . . . . . . 269 9.3.2 La funzione signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 9.3.3 Le funzioni kill e raise . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 9.3.4 Le funzioni alarm, abort ed i timer . . . . . . . . . . . . . . . . . . . . . 273 9.3.5 Le funzioni di pausa e attesa . . . . . . . . . . . . . . . . . . . . . . . . . 276 9.3.6 Un esempio elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 9.4 La gestione avanzata dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 9.4.1 Alcune problematiche aperte . . . . . . . . . . . . . . . . . . . . . . . . . 279 9.4.2 Gli insiemi di segnali o signal set . . . . . . . . . . . . . . . . . . . . . . . 281 9.4.3 La funzione sigaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 9.4.4 La gestione della maschera dei segnali o signal mask . . . . . . . . . . . . 287 9.4.5 Criteri di programmazione per i gestori dei segnali . . . . . . . . . . . . . 289 9.5 Funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 9.5.1 I segnali real-time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290 9.5.2 La gestione avanzata delle temporizzazioni . . . . . . . . . . . . . . . . . 294 9.5.3 Ulteriori funzioni di gestione . . . . . . . . . . . . . . . . . . . . . . . . . 301 10 Interfaccia utente: terminali e sessioni di lavoro 305 10.1 L’interazione con i terminali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 10.1.1 Il job control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305 10.1.2 I process group e le sessioni . . . . . . . . . . . . . . . . . . . . . . . . . . 306 10.1.3 Il terminale di controllo e il controllo di sessione . . . . . . . . . . . . . . 309 10.1.4 Dal login alla shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 10.1.5 Interazione senza terminale: i demoni ed il syslog . . . . . . . . . . . . . . 313 10.2 L’I/O su terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 10.2.1 L’architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 10.2.2 La gestione delle caratteristiche di un terminale . . . . . . . . . . . . . . . 321 10.2.3 La gestione della disciplina di linea. . . . . . . . . . . . . . . . . . . . . . 332 10.2.4 Operare in modo non canonico . . . . . . . . . . . . . . . . . . . . . . . . 333 10.3 La gestione dei terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 10.3.1 I terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 10.3.2 Allocazione dei terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . 334 11 L’intercomunicazione fra processi 335 11.1 L’intercomunicazione fra processi tradizionale . . . . . . . . . . . . . . . . . . . . 335 11.1.1 Le pipe standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 11.1.2 Un esempio dell’uso delle pipe . . . . . . . . . . . . . . . . . . . . . . . . 337 11.1.3 Le funzioni popen e pclose . . . . . . . . . . . . . . . . . . . . . . . . . . 339 11.1.4 Le pipe con nome, o fifo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342 viii INDICE 11.1.5 La funzione socketpair . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 11.2 L’intercomunicazione fra processi di System V . . . . . . . . . . . . . . . . . . . . 348 11.2.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 11.2.2 Il controllo di accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 11.2.3 Gli identificatori ed il loro utilizzo . . . . . . . . . . . . . . . . . . . . . . 351 11.2.4 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 11.2.5 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 11.2.6 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 11.3 Tecniche alternative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 11.3.1 Alternative alle code di messaggi . . . . . . . . . . . . . . . . . . . . . . . 383 11.3.2 I file di lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383 11.3.3 La sincronizzazione con il file locking . . . . . . . . . . . . . . . . . . . . . 385 11.3.4 Il memory mapping anonimo . . . . . . . . . . . . . . . . . . . . . . . . . 387 11.4 L’intercomunicazione fra processi di POSIX . . . . . . . . . . . . . . . . . . . . . 387 11.4.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387 11.4.2 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388 11.4.3 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394 11.4.4 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 12 La gestione avanzata dei file 407 12.1 Il file locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 12.1.1 L’advisory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407 12.1.2 La funzione flock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408 12.1.3 Il file locking POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 12.1.4 La funzione lockf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 12.1.5 Il mandatory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 12.2 L’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 12.2.1 La problematica dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 419 12.2.2 Le funzioni select e pselect . . . . . . . . . . . . . . . . . . . . . . . . . 420 12.2.3 Le funzioni poll e ppoll . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 12.2.4 L’interfaccia di epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 12.2.5 La notifica di eventi tramite file descriptor . . . . . . . . . . . . . . . . . . 431 12.3 L’accesso asincrono ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 12.3.1 Il Signal driven I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440 12.3.2 I meccanismi di notifica asincrona. . . . . . . . . . . . . . . . . . . . . . . 441 12.3.3 L’interfaccia POSIX per l’I/O asincrono . . . . . . . . . . . . . . . . . . . 451 12.4 Altre modalit`a di I/O avanzato . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 12.4.1 File mappati in memoria. . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 12.4.2 I/O vettorizzato: readv e writev . . . . . . . . . . . . . . . . . . . . . . . 464 12.4.3 L’I/O diretto fra file descriptor: sendfile e splice . . . . . . . . . . . . 466 12.4.4 Gestione avanzata dell’accesso ai dati dei file . . . . . . . . . . . . . . . . 475 13 I thread 479 13.1 Introduzione ai thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 13.1.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 13.1.2 I thread e Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 13.1.3 Implementazioni alternative . . . . . . . . . . . . . . . . . . . . . . . . . . 479 13.2 Posix thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479 13.2.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 13.2.2 La gestione dei thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 13.2.3 I mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 INDICE ix 13.2.4 Le variabili di condizione . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 II Programmazione di rete 481 14 Introduzione alla programmazione di rete 483 14.1 Modelli di programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 14.1.1 Il modello client-server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 14.1.2 Il modello peer-to-peer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 14.1.3 Il modello three-tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 14.2 I protocolli di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 14.2.1 Il modello ISO/OSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 14.2.2 Il modello TCP/IP (o DoD) . . . . . . . . . . . . . . . . . . . . . . . . . . 486 14.2.3 Criteri generali dell’architettura del TCP/IP . . . . . . . . . . . . . . . . 488 14.3 Il protocollo TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 14.3.1 Il quadro generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 14.3.2 Internet Protocol (IP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 14.3.3 User Datagram Protocol (UDP) . . . . . . . . . . . . . . . . . . . . . . . 492 14.3.4 Transport Control Protocol (TCP) . . . . . . . . . . . . . . . . . . . . . . 492 14.3.5 Limiti e dimensioni riguardanti la trasmissione dei dati . . . . . . . . . . 493 15 Introduzione ai socket 497 15.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 15.1.1 I socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 15.1.2 Concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497 15.2 La creazione di un socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 15.2.1 La funzione socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498 15.2.2 Il dominio dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 15.2.3 Il tipo di socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 15.3 Le strutture degli indirizzi dei socket . . . . . . . . . . . . . . . . . . . . . . . . . 501 15.3.1 La struttura generica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501 15.3.2 La struttura degli indirizzi IPv4 . . . . . . . . . . . . . . . . . . . . . . . 502 15.3.3 La struttura degli indirizzi IPv6 . . . . . . . . . . . . . . . . . . . . . . . 503 15.3.4 La struttura degli indirizzi locali . . . . . . . . . . . . . . . . . . . . . . . 504 15.3.5 La struttura degli indirizzi AppleTalk . . . . . . . . . . . . . . . . . . . . 504 15.3.6 La struttura degli indirizzi dei packet socket . . . . . . . . . . . . . . . . . 505 15.4 Le funzioni di conversione degli indirizzi . . . . . . . . . . . . . . . . . . . . . . . 506 15.4.1 Le funzioni per il riordinamento . . . . . . . . . . . . . . . . . . . . . . . 506 15.4.2 Le funzioni inet_aton, inet_addr e inet_ntoa . . . . . . . . . . . . . . 507 15.4.3 Le funzioni inet_pton e inet_ntop . . . . . . . . . . . . . . . . . . . . . 508 16 I socket TCP 509 16.1 Il funzionamento di una connessione TCP . . . . . . . . . . . . . . . . . . . . . . 509 16.1.1 La creazione della connessione: il three way handshake . . . . . . . . . . . 509 16.1.2 Le opzioni TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 16.1.3 La terminazione della connessione . . . . . . . . . . . . . . . . . . . . . . 511 16.1.4 Un esempio di connessione. . . . . . . . . . . . . . . . . . . . . . . . . . . 512 16.1.5 Lo stato TIME_WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 16.1.6 I numeri di porta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 16.1.7 Le porte ed il modello client/server . . . . . . . . . . . . . . . . . . . . . . 517 16.2 Le funzioni di base per la gestione dei socket . . . . . . . . . . . . . . . . . . . . 518 x INDICE 16.2.1 La funzione bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518 16.2.2 La funzione connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520 16.2.3 La funzione listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 16.2.4 La funzione accept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 16.2.5 Le funzioni getsockname e getpeername. . . . . . . . . . . . . . . . . . . 524 16.2.6 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 16.3 Un esempio elementare: il servizio daytime . . . . . . . . . . . . . . . . . . . . . . 526 16.3.1 Il comportamento delle funzioni di I/O. . . . . . . . . . . . . . . . . . . . 526 16.3.2 Il client daytime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 16.3.3 Un server daytime iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . 530 16.3.4 Un server daytime concorrente . . . . . . . . . . . . . . . . . . . . . . . . 532 16.4 Un esempio piu` completo: il servizio echo . . . . . . . . . . . . . . . . . . . . . . 534 16.4.1 Il servizio echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534 16.4.2 Il client echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 535 16.4.3 Il server echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 536 16.4.4 L’avvio e il funzionamento normale . . . . . . . . . . . . . . . . . . . . . . 539 16.4.5 La conclusione normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 16.4.6 La gestione dei processi figli . . . . . . . . . . . . . . . . . . . . . . . . . . 541 16.5 I vari scenari critici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 16.5.1 La terminazione precoce della connessione . . . . . . . . . . . . . . . . . . 545 16.5.2 La terminazione precoce del server . . . . . . . . . . . . . . . . . . . . . . 546 16.5.3 Altri scenari di terminazione della connessione . . . . . . . . . . . . . . . 550 16.6 L’uso dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553 16.6.1 Il comportamento della funzione select con i socket. . . . . . . . . . . . 553 16.6.2 Un esempio di I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . 554 16.6.3 La funzione shutdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 16.6.4 Un server basato sull’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 561 16.6.5 I/O multiplexing con poll . . . . . . . . . . . . . . . . . . . . . . . . . . 564 16.6.6 I/O multiplexing con epoll . . . . . . . . . . . . . . . . . . . . . . . . . . 567 17 La gestione dei socket 569 17.1 La risoluzione dei nomi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 17.1.1 La struttura del resolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 17.1.2 Le funzioni di interrogazione del resolver . . . . . . . . . . . . . . . . . . 571 17.1.3 La risoluzione dei nomi a dominio . . . . . . . . . . . . . . . . . . . . . . 577 17.1.4 Le funzioni avanzate per la risoluzione dei nomi . . . . . . . . . . . . . . . 584 17.2 Le opzioni dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 594 17.2.1 Le funzioni setsockopt e getsockopt . . . . . . . . . . . . . . . . . . . . 595 17.2.2 Le opzioni generiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 17.2.3 L’uso delle principali opzioni dei socket . . . . . . . . . . . . . . . . . . . 601 17.2.4 Le opzioni per il protocollo IPv4 . . . . . . . . . . . . . . . . . . . . . . . 607 17.2.5 Le opzioni per i protocolli TCP e UDP . . . . . . . . . . . . . . . . . . . 611 17.3 La gestione attraverso le funzioni di controllo . . . . . . . . . . . . . . . . . . . . 618 17.3.1 L’uso di ioctl e fcntl per i socket generici . . . . . . . . . . . . . . . . . 618 17.3.2 L’uso di ioctl per l’accesso ai dispositivi di rete . . . . . . . . . . . . . . 619 17.3.3 L’uso di ioctl per i socket TCP e UDP . . . . . . . . . . . . . . . . . . . 624 17.4 La gestione con sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . . . 624 17.4.1 L’uso di sysctl e /proc per le propriet`a della rete . . . . . . . . . . . . . 625 17.4.2 I valori di controllo per i socket generici . . . . . . . . . . . . . . . . . . . 625 17.4.3 I valori di controllo per il protocollo IPv4 . . . . . . . . . . . . . . . . . . 627
Description: