GaPiL Guida alla Programmazione in Linux Simone Piccardi 25 luglio 2010 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 . . . . . . . . . . . . . . . . . 11 1.2.7 Il controllo di aderenza agli standard . . . . . . . . . . . . . . . . . . . . . 12 2 L’interfaccia base con i processi 17 2.1 Esecuzione e conclusione di un programma . . . . . . . . . . . . . . . . . . . . . 17 2.1.1 La funzione main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1.2 Come chiudere un programma . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.3 Le funzioni exit e _exit . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.4 Le funzioni atexit e on_exit . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.1.5 Conclusioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2 I processi e l’uso della memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.1 I concetti generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.2 La struttura della memoria di un processo . . . . . . . . . . . . . . . . . . 21 2.2.3 Allocazione della memoria per i programmi C . . . . . . . . . . . . . . . . 23 2.2.4 Il controllo della memoria virtuale . . . . . . . . . . . . . . . . . . . . . . 27 2.2.5 Gestione avanzata dell’allocazione della memoria . . . . . . . . . . . . . . 30 2.3 Argomenti, ambiente ed altre propriet`a di un processo . . . . . . . . . . . . . . . 32 2.3.1 Il formato degli argomenti . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.3.2 La gestione delle opzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.3 Le variabili di ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 2.3.4 La localizzazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 iii iv INDICE 2.4 Problematiche di programmazione generica . . . . . . . . . . . . . . . . . . . . . 38 2.4.1 Il passaggio delle variabili e dei valori di ritorno . . . . . . . . . . . . . . . 38 2.4.2 Il passaggio di un numero variabile di argomenti . . . . . . . . . . . . . . 39 2.4.3 Potenziali problemi con le variabili automatiche . . . . . . . . . . . . . . . 41 2.4.4 Il controllo di flusso non locale . . . . . . . . . . . . . . . . . . . . . . . . 41 3 La gestione dei processi 45 3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.1.1 L’architettura della gestione dei processi . . . . . . . . . . . . . . . . . . . 45 3.1.2 Una panoramica sulle funzioni fondamentali . . . . . . . . . . . . . . . . . 47 3.2 Le funzioni di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.2.1 Gli identificatori dei processi . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.2.2 La funzione fork e le funzioni di creazione dei processi . . . . . . . . . . . 49 3.2.3 La conclusione di un processo . . . . . . . . . . . . . . . . . . . . . . . . . 55 3.2.4 La funzione waitpid e le funzioni di ricezione degli stati di uscita. . . . . 57 3.2.5 La funzione exec e le funzioni di esecuzione dei programmi . . . . . . . . 62 3.3 Il controllo di accesso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.3.1 Gli identificatori del controllo di accesso . . . . . . . . . . . . . . . . . . . 66 3.3.2 Le funzioni di gestione degli identificatori dei processi . . . . . . . . . . . 68 3.3.3 Le funzioni per la gestione dei gruppi associati a un processo . . . . . . . 71 3.4 La gestione della priorit`a dei processi . . . . . . . . . . . . . . . . . . . . . . . . . 73 3.4.1 I meccanismi di scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . 73 3.4.2 Il meccanismo di scheduling standard . . . . . . . . . . . . . . . . . . . . 74 3.4.3 Il meccanismo di scheduling real-time . . . . . . . . . . . . . . . . . . . . 77 3.4.4 Il controllo dello scheduler per i sistemi multiprocessore . . . . . . . . . . 81 3.4.5 Le priorit`a per le operazioni di I/O . . . . . . . . . . . . . . . . . . . . . . 83 3.5 Problematiche di programmazione multitasking . . . . . . . . . . . . . . . . . . . 86 3.5.1 Le operazioni atomiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 3.5.2 Le race condition ed i deadlock . . . . . . . . . . . . . . . . . . . . . . . . 87 3.5.3 Le funzioni rientranti. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4 L’architettura dei file 89 4.1 L’architettura generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.1.1 L’organizzazione di file e directory . . . . . . . . . . . . . . . . . . . . . . 89 4.1.2 I tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 4.1.3 Le due interfacce ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 4.2 L’architettura della gestione dei file . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.2.1 Il Virtual File System di Linux . . . . . . . . . . . . . . . . . . . . . . . . 92 4.2.2 Il funzionamento del Virtual File System . . . . . . . . . . . . . . . . . . 94 4.2.3 Il funzionamento di un filesystem Unix . . . . . . . . . . . . . . . . . . . . 95 4.2.4 I filesystem di uso comune . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5 File e directory 101 5.1 La gestione di file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.1.1 Le funzioni link e unlink . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.1.2 Le funzioni remove e rename . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.1.3 I link simbolici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 5.1.4 La creazione e la cancellazione delle directory . . . . . . . . . . . . . . . . 108 5.1.5 La creazione di file speciali . . . . . . . . . . . . . . . . . . . . . . . . . . 109 5.1.6 Accesso alle directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.1.7 La directory di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 INDICE v 5.1.8 I file temporanei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 5.2 La manipolazione delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 121 5.2.1 La lettura delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 121 5.2.2 I tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.2.3 Le dimensioni dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 5.2.4 I tempi dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.3 Il controllo di accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 5.3.1 I permessi per l’accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . 128 5.3.2 I bit dei permessi speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 5.3.3 Le funzioni per la gestione dei permessi dei file . . . . . . . . . . . . . . . 132 5.3.4 La gestione della titolarit`a dei file . . . . . . . . . . . . . . . . . . . . . . 135 5.3.5 Un quadro d’insieme sui permessi . . . . . . . . . . . . . . . . . . . . . . . 136 5.4 Caratteristiche e funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . 137 5.4.1 La gestione delle capabilities . . . . . . . . . . . . . . . . . . . . . . . . . 137 5.4.2 Gli attributi estesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.4.3 Le Access Control List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 5.4.4 La funzione chroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 6 I file: l’interfaccia standard Unix 161 6.1 L’architettura di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 6.1.1 L’architettura dei file descriptor . . . . . . . . . . . . . . . . . . . . . . . 161 6.1.2 I file standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 6.2 Le funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 6.2.1 La funzione open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 6.2.2 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 6.2.3 La funzione lseek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 6.2.4 Le funzioni read e pread . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 6.2.5 Le funzioni write e pwrite . . . . . . . . . . . . . . . . . . . . . . . . . . 169 6.3 Caratteristiche avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 6.3.1 La condivisione dei files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 6.3.2 Operazioni atomiche con i file . . . . . . . . . . . . . . . . . . . . . . . . . 171 6.3.3 Le funzioni sync e fsync . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 6.3.4 Le funzioni dup e dup2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 6.3.5 Le funzioni openat, mkdirat e affini . . . . . . . . . . . . . . . . . . . . . 175 6.3.6 La funzione fcntl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 6.3.7 La funzione ioctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 7 I file: l’interfaccia standard ANSI C 183 7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 7.1.1 I file stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 7.1.2 Gli oggetti FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 7.1.3 Gli stream standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 7.1.4 Le modalit`a di bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . . 184 7.2 Funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 7.2.1 Apertura e chiusura di uno stream . . . . . . . . . . . . . . . . . . . . . . 186 7.2.2 Lettura e scrittura su uno stream . . . . . . . . . . . . . . . . . . . . . . . 188 7.2.3 Input/output binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 7.2.4 Input/output a caratteri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 7.2.5 Input/output di linea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 7.2.6 L’input/output formattato . . . . . . . . . . . . . . . . . . . . . . . . . . 194 7.2.7 Posizionamento su uno stream . . . . . . . . . . . . . . . . . . . . . . . . 198 vi INDICE 7.3 Funzioni avanzate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 7.3.1 Le funzioni di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 7.3.2 Il controllo della bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . 200 7.3.3 Gli stream e i thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 8 La gestione del sistema, del tempo e degli errori 205 8.1 Capacit`a e caratteristiche del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 205 8.1.1 Limiti e parametri di sistema . . . . . . . . . . . . . . . . . . . . . . . . . 205 8.1.2 La funzione sysconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 8.1.3 I limiti dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 8.1.4 La funzione pathconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 8.1.5 La funzione uname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 8.2 Opzioni e configurazione del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 211 8.2.1 La funzione sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . 211 8.2.2 La gestione delle propriet`a dei filesystem . . . . . . . . . . . . . . . . . . . 213 8.2.3 La gestione delle informazioni su utenti e gruppi . . . . . . . . . . . . . . 216 8.2.4 Il registro della contabilit`a degli utenti . . . . . . . . . . . . . . . . . . . . 219 8.3 Il controllo dell’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 8.3.1 L’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 8.3.2 Limiti sulle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 8.3.3 Le risorse di memoria e processore . . . . . . . . . . . . . . . . . . . . . . 224 8.3.4 La contabilit`a in stile BSD . . . . . . . . . . . . . . . . . . . . . . . . . . 226 8.4 La gestione dei tempi del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 8.4.1 La misura del tempo in Unix . . . . . . . . . . . . . . . . . . . . . . . . . 227 8.4.2 La gestione del process time . . . . . . . . . . . . . . . . . . . . . . . . . . 228 8.4.3 Le funzioni per il calendar time . . . . . . . . . . . . . . . . . . . . . . . . 229 8.4.4 La gestione delle date. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 8.5 La gestione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 8.5.1 La variabile errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 8.5.2 Le funzioni strerror e perror . . . . . . . . . . . . . . . . . . . . . . . . 235 8.5.3 Alcune estensioni GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 9 I segnali 239 9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 9.1.1 I concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 9.1.2 Le semantiche del funzionamento dei segnali . . . . . . . . . . . . . . . . 240 9.1.3 Tipi di segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 9.1.4 La notifica dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 9.2 La classificazione dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 9.2.1 I segnali standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 9.2.2 Segnali di errore di programma . . . . . . . . . . . . . . . . . . . . . . . . 243 9.2.3 I segnali di terminazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 9.2.4 I segnali di allarme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 9.2.5 I segnali di I/O asincrono . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 9.2.6 I segnali per il controllo di sessione . . . . . . . . . . . . . . . . . . . . . . 247 9.2.7 I segnali di operazioni errate . . . . . . . . . . . . . . . . . . . . . . . . . 247 9.2.8 Ulteriori segnali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 9.2.9 Le funzioni strsignal e psignal . . . . . . . . . . . . . . . . . . . . . . . 248 9.3 La gestione di base dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 9.3.1 Il comportamento generale del sistema . . . . . . . . . . . . . . . . . . . . 249 9.3.2 La funzione signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 INDICE vii 9.3.3 Le funzioni kill e raise . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 9.3.4 Le funzioni alarm, abort ed i timer . . . . . . . . . . . . . . . . . . . . . 253 9.3.5 Le funzioni di pausa e attesa . . . . . . . . . . . . . . . . . . . . . . . . . 256 9.3.6 Un esempio elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 9.4 La gestione avanzata dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259 9.4.1 Alcune problematiche aperte . . . . . . . . . . . . . . . . . . . . . . . . . 259 9.4.2 Gli insiemi di segnali o signal set . . . . . . . . . . . . . . . . . . . . . . . 261 9.4.3 La funzione sigaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 9.4.4 La gestione della maschera dei segnali o signal mask . . . . . . . . . . . . 267 9.4.5 Ulteriori funzioni di gestione . . . . . . . . . . . . . . . . . . . . . . . . . 269 9.4.6 Criteri di programmazione per i gestori dei segnali . . . . . . . . . . . . . 271 9.5 Funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 9.5.1 I segnali real-time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 9.5.2 La gestione avanzata delle temporizzazioni . . . . . . . . . . . . . . . . . 276 9.5.3 Le interfacce per la notifica attraverso i file descriptor . . . . . . . . . . . 283 10 Terminali e sessioni di lavoro 285 10.1 Il job control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 10.1.1 Una panoramica introduttiva . . . . . . . . . . . . . . . . . . . . . . . . . 285 10.1.2 I process group e le sessioni . . . . . . . . . . . . . . . . . . . . . . . . . . 286 10.1.3 Il terminale di controllo e il controllo di sessione . . . . . . . . . . . . . . 288 10.1.4 Dal login alla shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 10.1.5 Prescrizioni per un programma daemon . . . . . . . . . . . . . . . . . . . 292 10.2 L’I/O su terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 10.2.1 L’architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296 10.2.2 La gestione delle caratteristiche di un terminale . . . . . . . . . . . . . . . 298 10.2.3 La gestione della disciplina di linea. . . . . . . . . . . . . . . . . . . . . . 308 10.2.4 Operare in modo non canonico . . . . . . . . . . . . . . . . . . . . . . . . 309 10.3 La gestione dei terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 10.3.1 I terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310 10.3.2 Allocazione dei terminale virtuali . . . . . . . . . . . . . . . . . . . . . . . 310 11 La comunicazione fra processi 311 11.1 La comunicazione fra processi tradizionale . . . . . . . . . . . . . . . . . . . . . . 311 11.1.1 Le pipe standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 11.1.2 Un esempio dell’uso delle pipe . . . . . . . . . . . . . . . . . . . . . . . . 313 11.1.3 Le funzioni popen e pclose . . . . . . . . . . . . . . . . . . . . . . . . . . 315 11.1.4 Le pipe con nome, o fifo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318 11.1.5 La funzione socketpair . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324 11.2 Il sistema di comunicazione fra processi di System V . . . . . . . . . . . . . . . . 324 11.2.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 11.2.2 Il controllo di accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 11.2.3 Gli identificatori ed il loro utilizzo . . . . . . . . . . . . . . . . . . . . . . 327 11.2.4 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 11.2.5 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 11.2.6 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 11.3 Tecniche alternative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 11.3.1 Alternative alle code di messaggi . . . . . . . . . . . . . . . . . . . . . . . 359 11.3.2 I file di lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 11.3.3 La sincronizzazione con il file locking . . . . . . . . . . . . . . . . . . . . . 361 11.3.4 Il memory mapping anonimo . . . . . . . . . . . . . . . . . . . . . . . . . 363 viii INDICE 11.4 Il sistema di comunicazione fra processi di POSIX . . . . . . . . . . . . . . . . . 363 11.4.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 11.4.2 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 11.4.3 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370 11.4.4 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 12 La gestione avanzata dei file 379 12.1 Il file locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 12.1.1 L’advisory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 12.1.2 La funzione flock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380 12.1.3 Il file locking POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 12.1.4 La funzione lockf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 12.1.5 Il mandatory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389 12.2 L’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391 12.2.1 La problematica dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 391 12.2.2 Le funzioni select e pselect . . . . . . . . . . . . . . . . . . . . . . . . . 392 12.2.3 Le funzioni poll e ppoll . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 12.2.4 L’interfaccia di epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398 12.3 L’accesso asincrono ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 12.3.1 Il Signal driven I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 12.3.2 I meccanismi di notifica asincrona. . . . . . . . . . . . . . . . . . . . . . . 404 12.3.3 L’interfaccia POSIX per l’I/O asincrono . . . . . . . . . . . . . . . . . . . 414 12.4 Altre modalit`a di I/O avanzato . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 12.4.1 File mappati in memoria. . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 12.4.2 I/O vettorizzato: readv e writev . . . . . . . . . . . . . . . . . . . . . . . 426 12.4.3 L’I/O diretto fra file descriptor: sendfile e splice . . . . . . . . . . . . 429 12.4.4 Gestione avanzata dell’accesso ai dati dei file . . . . . . . . . . . . . . . . 436 13 I thread 443 13.1 Introduzione ai thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.1.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.1.2 I thread e Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.1.3 La system call clone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.1.4 Implementazioni alternative . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.2 Posix thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443 13.2.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 13.2.2 La gestione dei thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 13.2.3 I mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 13.2.4 Le variabili di condizione . . . . . . . . . . . . . . . . . . . . . . . . . . . 444 II Programmazione di rete 445 14 Introduzione alla programmazione di rete 447 14.1 Modelli di programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 14.1.1 Il modello client-server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447 14.1.2 Il modello peer-to-peer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 14.1.3 Il modello three-tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 14.2 I protocolli di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 14.2.1 Il modello ISO/OSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449 14.2.2 Il modello TCP/IP (o DoD) . . . . . . . . . . . . . . . . . . . . . . . . . . 450 INDICE ix 14.2.3 Criteri generali dell’architettura del TCP/IP . . . . . . . . . . . . . . . . 452 14.3 Il protocollo TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 14.3.1 Il quadro generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 14.3.2 Internet Protocol (IP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 14.3.3 User Datagram Protocol (UDP) . . . . . . . . . . . . . . . . . . . . . . . 456 14.3.4 Transport Control Protocol (TCP) . . . . . . . . . . . . . . . . . . . . . . 456 14.3.5 Limiti e dimensioni riguardanti la trasmissione dei dati . . . . . . . . . . 457 15 Introduzione ai socket 461 15.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 15.1.1 I socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 15.1.2 Concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 15.2 La creazione di un socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 15.2.1 La funzione socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462 15.2.2 Il dominio dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463 15.2.3 Il tipo di socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 15.3 Le strutture degli indirizzi dei socket . . . . . . . . . . . . . . . . . . . . . . . . . 465 15.3.1 La struttura generica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 15.3.2 La struttura degli indirizzi IPv4 . . . . . . . . . . . . . . . . . . . . . . . 466 15.3.3 La struttura degli indirizzi IPv6 . . . . . . . . . . . . . . . . . . . . . . . 467 15.3.4 La struttura degli indirizzi locali . . . . . . . . . . . . . . . . . . . . . . . 468 15.3.5 La struttura degli indirizzi AppleTalk . . . . . . . . . . . . . . . . . . . . 468 15.3.6 La struttura degli indirizzi dei packet socket . . . . . . . . . . . . . . . . . 469 15.4 Le funzioni di conversione degli indirizzi . . . . . . . . . . . . . . . . . . . . . . . 470 15.4.1 La endianess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 15.4.2 Le funzioni per il riordinamento . . . . . . . . . . . . . . . . . . . . . . . 472 15.4.3 Le funzioni inet_aton, inet_addr e inet_ntoa . . . . . . . . . . . . . . 472 15.4.4 Le funzioni inet_pton e inet_ntop . . . . . . . . . . . . . . . . . . . . . 473 16 I socket TCP 475 16.1 Il funzionamento di una connessione TCP . . . . . . . . . . . . . . . . . . . . . . 475 16.1.1 La creazione della connessione: il three way handshake . . . . . . . . . . . 475 16.1.2 Le opzioni TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 16.1.3 La terminazione della connessione . . . . . . . . . . . . . . . . . . . . . . 477 16.1.4 Un esempio di connessione. . . . . . . . . . . . . . . . . . . . . . . . . . . 478 16.1.5 Lo stato TIME_WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480 16.1.6 I numeri di porta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 16.1.7 Le porte ed il modello client/server . . . . . . . . . . . . . . . . . . . . . . 483 16.2 Le funzioni di base per la gestione dei socket . . . . . . . . . . . . . . . . . . . . 484 16.2.1 La funzione bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 16.2.2 La funzione connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 16.2.3 La funzione listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487 16.2.4 La funzione accept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489 16.2.5 Le funzioni getsockname e getpeername. . . . . . . . . . . . . . . . . . . 490 16.2.6 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492 16.3 Un esempio elementare: il servizio daytime . . . . . . . . . . . . . . . . . . . . . . 492 16.3.1 Il comportamento delle funzioni di I/O. . . . . . . . . . . . . . . . . . . . 492 16.3.2 Il client daytime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 16.3.3 Un server daytime iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . 496 16.3.4 Un server daytime concorrente . . . . . . . . . . . . . . . . . . . . . . . . 498 16.4 Un esempio piu` completo: il servizio echo . . . . . . . . . . . . . . . . . . . . . . 500 x INDICE 16.4.1 Il servizio echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 16.4.2 Il client echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 501 16.4.3 Il server echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 502 16.4.4 L’avvio e il funzionamento normale . . . . . . . . . . . . . . . . . . . . . . 505 16.4.5 La conclusione normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 16.4.6 La gestione dei processi figli . . . . . . . . . . . . . . . . . . . . . . . . . . 507 16.5 I vari scenari critici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 16.5.1 La terminazione precoce della connessione . . . . . . . . . . . . . . . . . . 511 16.5.2 La terminazione precoce del server . . . . . . . . . . . . . . . . . . . . . . 512 16.5.3 Altri scenari di terminazione della connessione . . . . . . . . . . . . . . . 516 16.6 L’uso dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 16.6.1 Il comportamento della funzione select con i socket. . . . . . . . . . . . 519 16.6.2 Un esempio di I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . 520 16.6.3 La funzione shutdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 16.6.4 Un server basato sull’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 527 16.6.5 I/O multiplexing con poll . . . . . . . . . . . . . . . . . . . . . . . . . . 530 17 La gestione dei socket 535 17.1 La risoluzione dei nomi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535 17.1.1 La struttura del resolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535 17.1.2 Le funzioni di interrogazione del resolver . . . . . . . . . . . . . . . . . . 537 17.1.3 La risoluzione dei nomi a dominio . . . . . . . . . . . . . . . . . . . . . . 543 17.1.4 Le funzioni avanzate per la risoluzione dei nomi . . . . . . . . . . . . . . . 550 17.2 Le opzioni dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560 17.2.1 Le funzioni setsockopt e getsockopt . . . . . . . . . . . . . . . . . . . . 561 17.2.2 Le opzioni generiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563 17.2.3 L’uso delle principali opzioni dei socket . . . . . . . . . . . . . . . . . . . 567 17.2.4 Le opzioni per il protocollo IPv4 . . . . . . . . . . . . . . . . . . . . . . . 573 17.2.5 Le opzioni per i protocolli TCP e UDP . . . . . . . . . . . . . . . . . . . 577 17.3 La gestione attraverso le funzioni di controllo . . . . . . . . . . . . . . . . . . . . 584 17.3.1 L’uso di ioctl e fcntl per i socket generici . . . . . . . . . . . . . . . . . 584 17.3.2 L’uso di ioctl per l’accesso ai dispositivi di rete . . . . . . . . . . . . . . 585 17.3.3 L’uso di ioctl per i socket TCP e UDP . . . . . . . . . . . . . . . . . . . 590 17.4 La gestione con sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . . . 590 17.4.1 L’uso di sysctl e /proc per le propriet`a della rete . . . . . . . . . . . . . 591 17.4.2 I valori di controllo per i socket generici . . . . . . . . . . . . . . . . . . . 591 17.4.3 I valori di controllo per il protocollo IPv4 . . . . . . . . . . . . . . . . . . 593 18 Gli altri tipi di socket 601 18.1 I socket UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 18.1.1 Le caratteristiche di un socket UDP . . . . . . . . . . . . . . . . . . . . . 601 18.1.2 Le funzioni sendto e recvfrom . . . . . . . . . . . . . . . . . . . . . . . . 602 18.1.3 Un client UDP elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . 605 18.1.4 Un server UDP elementare . . . . . . . . . . . . . . . . . . . . . . . . . . 607 18.1.5 Le problematiche dei socket UDP . . . . . . . . . . . . . . . . . . . . . . . 608 18.1.6 L’uso della funzione connect con i socket UDP . . . . . . . . . . . . . . . 612 18.2 I socket Unix domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 18.2.1 Il passaggio di file descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 613 18.3 Altri socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 18.3.1 I socket raw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614 18.3.2 I socket netlink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Description: