GaPiL Guida alla Programmazione in Linux Simone Piccardi 4 novembre 2008 ii Copyright (cid:13)c 2000-2008 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2.3 Lo standard System V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.4 Lo“standard”BSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 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.3 Argomenti, opzioni ed ambiente di un processo . . . . . . . . . . . . . . . . . . . 29 2.3.1 Il formato degli argomenti . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.3.2 La gestione delle opzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.3.3 Le variabili di ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.3.4 Opzioni in formato esteso . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.4 Problematiche di programmazione generica . . . . . . . . . . . . . . . . . . . . . 35 iii iv INDICE 2.4.1 Il passaggio delle variabili e dei valori di ritorno . . . . . . . . . . . . . . . 35 2.4.2 Il passaggio di un numero variabile di argomenti . . . . . . . . . . . . . . 35 2.4.3 Potenziali problemi con le variabili automatiche . . . . . . . . . . . . . . . 37 2.4.4 Il controllo di flusso non locale . . . . . . . . . . . . . . . . . . . . . . . . 38 3 La gestione dei processi 41 3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.1.1 L’architettura della gestione dei processi . . . . . . . . . . . . . . . . . . . 41 3.1.2 Una panoramica sulle funzioni fondamentali . . . . . . . . . . . . . . . . . 43 3.2 Le funzioni di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2.1 Gli identificatori dei processi . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.2.2 La funzione fork e le funzioni di creazione dei processi . . . . . . . . . . . 45 3.2.3 La conclusione di un processo . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2.4 La funzione waitpid e le funzioni di ricezione degli stati di uscita. . . . . 53 3.2.5 La funzione exec e le funzioni di esecuzione dei programmi . . . . . . . . 57 3.3 Il controllo di accesso. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.3.1 Gli identificatori del controllo di accesso . . . . . . . . . . . . . . . . . . . 61 3.3.2 Le funzioni di gestione degli identificatori dei processi . . . . . . . . . . . 63 3.3.3 Le funzioni per la gestione dei gruppi associati a un processo . . . . . . . 66 3.3.4 La gestione delle capabilities . . . . . . . . . . . . . . . . . . . . . . . . . 68 3.4 La gestione della priorit`a di esecuzione . . . . . . . . . . . . . . . . . . . . . . . . 76 3.4.1 I meccanismi di scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.4.2 Il meccanismo di scheduling standard . . . . . . . . . . . . . . . . . . . . 77 3.4.3 Il meccanismo di scheduling real-time . . . . . . . . . . . . . . . . . . . . 79 3.4.4 Il controllo dello scheduler per i sistemi multiprocessore . . . . . . . . . . 83 3.5 Problematiche di programmazione multitasking . . . . . . . . . . . . . . . . . . . 85 3.5.1 Le operazioni atomiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.5.2 Le race condition ed i deadlock . . . . . . . . . . . . . . . . . . . . . . . . 86 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 Il filesystem ext2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5 File e directory 99 5.1 La gestione di file e directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.1.1 Le funzioni link e unlink . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 5.1.2 Le funzioni remove e rename . . . . . . . . . . . . . . . . . . . . . . . . . 102 5.1.3 I link simbolici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.1.4 La creazione e la cancellazione delle directory . . . . . . . . . . . . . . . . 106 5.1.5 La creazione di file speciali . . . . . . . . . . . . . . . . . . . . . . . . . . 107 5.1.6 Accesso alle directory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.1.7 La directory di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 5.1.8 I file temporanei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 INDICE v 5.2 La manipolazione delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 119 5.2.1 La lettura delle caratteristiche dei file . . . . . . . . . . . . . . . . . . . . 119 5.2.2 I tipi di file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.2.3 Le dimensioni dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.2.4 I tempi dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.3 Il controllo di accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.3.1 I permessi per l’accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . . 124 5.3.2 I bit dei permessi speciali . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.3.3 Le funzioni per la gestione dei permessi dei file . . . . . . . . . . . . . . . 128 5.3.4 La gestione della titolarit`a dei file . . . . . . . . . . . . . . . . . . . . . . 131 5.3.5 Un quadro d’insieme sui permessi . . . . . . . . . . . . . . . . . . . . . . . 132 5.4 Caratteristiche e funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . 133 5.4.1 Gli attributi estesi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 5.4.2 Le Access Control List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 5.4.3 La funzione chroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 6 I file: l’interfaccia standard Unix 147 6.1 L’architettura di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.1.1 L’architettura dei file descriptor . . . . . . . . . . . . . . . . . . . . . . . 147 6.1.2 I file standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 6.2 Le funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.2.1 La funzione open . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.2.2 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.2.3 La funzione lseek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.2.4 La funzione read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.2.5 La funzione write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 6.3 Caratteristiche avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 6.3.1 La condivisione dei files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 6.3.2 Operazioni atomiche con i file . . . . . . . . . . . . . . . . . . . . . . . . . 157 6.3.3 Le funzioni sync e fsync . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 6.3.4 Le funzioni dup e dup2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 6.3.5 Le funzioni openat, mkdirat e affini . . . . . . . . . . . . . . . . . . . . . 160 6.3.6 La funzione fcntl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 6.3.7 La funzione ioctl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7 I file: l’interfaccia standard ANSI C 169 7.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 7.1.1 I file stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 7.1.2 Gli oggetti FILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 7.1.3 Gli stream standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 7.1.4 Le modalit`a di bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . . 170 7.2 Funzioni base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 7.2.1 Apertura e chiusura di uno stream . . . . . . . . . . . . . . . . . . . . . . 172 7.2.2 Lettura e scrittura su uno stream . . . . . . . . . . . . . . . . . . . . . . . 174 7.2.3 Input/output binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 7.2.4 Input/output a caratteri . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 7.2.5 Input/output di linea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 7.2.6 L’input/output formattato . . . . . . . . . . . . . . . . . . . . . . . . . . 180 7.2.7 Posizionamento su uno stream . . . . . . . . . . . . . . . . . . . . . . . . 184 7.3 Funzioni avanzate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 7.3.1 Le funzioni di controllo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 vi INDICE 7.3.2 Il controllo della bufferizzazione . . . . . . . . . . . . . . . . . . . . . . . . 186 7.3.3 Gli stream e i thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 8 La gestione del sistema, del tempo e degli errori 191 8.1 Capacit`a e caratteristiche del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 191 8.1.1 Limiti e parametri di sistema . . . . . . . . . . . . . . . . . . . . . . . . . 191 8.1.2 La funzione sysconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 8.1.3 I limiti dei file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 8.1.4 La funzione pathconf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 8.1.5 La funzione uname . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 8.2 Opzioni e configurazione del sistema . . . . . . . . . . . . . . . . . . . . . . . . . 197 8.2.1 La funzione sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . 197 8.2.2 La gestione delle propriet`a dei filesystem . . . . . . . . . . . . . . . . . . . 199 8.2.3 La gestione delle informazioni su utenti e gruppi . . . . . . . . . . . . . . 202 8.2.4 Il registro della contabilit`a degli utenti . . . . . . . . . . . . . . . . . . . . 205 8.3 Il controllo dell’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 8.3.1 L’uso delle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 8.3.2 Limiti sulle risorse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 8.3.3 Le risorse di memoria e processore . . . . . . . . . . . . . . . . . . . . . . 210 8.3.4 La contabilit`a in stile BSD . . . . . . . . . . . . . . . . . . . . . . . . . . 212 8.4 La gestione dei tempi del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 8.4.1 La misura del tempo in Unix . . . . . . . . . . . . . . . . . . . . . . . . . 213 8.4.2 La gestione del process time . . . . . . . . . . . . . . . . . . . . . . . . . . 214 8.4.3 Le funzioni per il calendar time . . . . . . . . . . . . . . . . . . . . . . . . 215 8.4.4 La gestione delle date. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 8.5 La gestione degli errori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 8.5.1 La variabile errno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 8.5.2 Le funzioni strerror e perror . . . . . . . . . . . . . . . . . . . . . . . . 221 8.5.3 Alcune estensioni GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 9 I segnali 225 9.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 9.1.1 I concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 9.1.2 Le semantiche del funzionamento dei segnali . . . . . . . . . . . . . . . . 226 9.1.3 Tipi di segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 9.1.4 La notifica dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 9.2 La classificazione dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 9.2.1 I segnali standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 9.2.2 Segnali di errore di programma . . . . . . . . . . . . . . . . . . . . . . . . 229 9.2.3 I segnali di terminazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 9.2.4 I segnali di allarme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 9.2.5 I segnali di I/O asincrono . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 9.2.6 I segnali per il controllo di sessione . . . . . . . . . . . . . . . . . . . . . . 233 9.2.7 I segnali di operazioni errate . . . . . . . . . . . . . . . . . . . . . . . . . 233 9.2.8 Ulteriori segnali. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 9.2.9 Le funzioni strsignal e psignal . . . . . . . . . . . . . . . . . . . . . . . 234 9.3 La gestione di base dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 9.3.1 Il comportamento generale del sistema . . . . . . . . . . . . . . . . . . . . 235 9.3.2 La funzione signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 9.3.3 Le funzioni kill e raise . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 9.3.4 Le funzioni alarm e abort . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 INDICE vii 9.3.5 Le funzioni di pausa e attesa . . . . . . . . . . . . . . . . . . . . . . . . . 242 9.3.6 Un esempio elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 9.4 La gestione avanzata dei segnali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 9.4.1 Alcune problematiche aperte . . . . . . . . . . . . . . . . . . . . . . . . . 245 9.4.2 Gli insiemi di segnali o signal set . . . . . . . . . . . . . . . . . . . . . . . 247 9.4.3 La funzione sigaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248 9.4.4 La gestione della maschera dei segnali o signal mask . . . . . . . . . . . . 251 9.4.5 Ulteriori funzioni di gestione . . . . . . . . . . . . . . . . . . . . . . . . . 254 9.4.6 Criteri di programmazione per i gestori dei segnali . . . . . . . . . . . . . 256 9.5 Funzionalit`a avanzate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 9.5.1 I segnali real-time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 9.5.2 La gestione avanzata delle temporizzazioni . . . . . . . . . . . . . . . . . 260 9.5.3 Le interfacce per la notifica attraverso i file descriptor . . . . . . . . . . . 260 10 Terminali e sessioni di lavoro 261 10.1 Il job control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 10.1.1 Una panoramica introduttiva . . . . . . . . . . . . . . . . . . . . . . . . . 261 10.1.2 I process group e le sessioni . . . . . . . . . . . . . . . . . . . . . . . . . . 262 10.1.3 Il terminale di controllo e il controllo di sessione . . . . . . . . . . . . . . 264 10.1.4 Dal login alla shell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 10.1.5 Prescrizioni per un programma daemon . . . . . . . . . . . . . . . . . . . 268 10.2 L’I/O su terminale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 10.2.1 L’architettura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 10.2.2 La gestione delle caratteristiche di un terminale . . . . . . . . . . . . . . . 274 10.2.3 La gestione della disciplina di linea. . . . . . . . . . . . . . . . . . . . . . 284 10.2.4 Operare in modo non canonico . . . . . . . . . . . . . . . . . . . . . . . . 285 10.3 La gestione dei terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 10.3.1 I terminali virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 10.3.2 Allocazione dei terminale virtuali . . . . . . . . . . . . . . . . . . . . . . . 286 11 La gestione avanzata dei file 287 11.1 L’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 11.1.1 La problematica dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 287 11.1.2 Le funzioni select e pselect . . . . . . . . . . . . . . . . . . . . . . . . . 288 11.1.3 Le funzioni poll e ppoll . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 11.1.4 L’interfaccia di epoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 11.2 L’accesso asincrono ai file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 11.2.1 Il Signal driven I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298 11.2.2 I meccanismi di notifica asincrona. . . . . . . . . . . . . . . . . . . . . . . 300 11.2.3 L’interfaccia POSIX per l’I/O asincrono . . . . . . . . . . . . . . . . . . . 309 11.3 Altre modalit`a di I/O avanzato . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 11.3.1 File mappati in memoria. . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 11.3.2 I/O vettorizzato: readv e writev . . . . . . . . . . . . . . . . . . . . . . . 322 11.3.3 L’I/O diretto fra file descriptor: sendfile e splice . . . . . . . . . . . . 323 11.3.4 Gestione avanzata dell’accesso ai dati dei file . . . . . . . . . . . . . . . . 330 11.4 Il file locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 11.4.1 L’advisory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334 11.4.2 La funzione flock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 11.4.3 Il file locking POSIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 11.4.4 La funzione lockf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 11.4.5 Il mandatory locking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344 viii INDICE 12 La comunicazione fra processi 347 12.1 La comunicazione fra processi tradizionale . . . . . . . . . . . . . . . . . . . . . . 347 12.1.1 Le pipe standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 12.1.2 Un esempio dell’uso delle pipe . . . . . . . . . . . . . . . . . . . . . . . . 349 12.1.3 Le funzioni popen e pclose . . . . . . . . . . . . . . . . . . . . . . . . . . 351 12.1.4 Le pipe con nome, o fifo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 12.1.5 La funzione socketpair . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 12.2 Il sistema di comunicazione fra processi di System V . . . . . . . . . . . . . . . . 360 12.2.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 12.2.2 Il controllo di accesso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 12.2.3 Gli identificatori ed il loro utilizzo . . . . . . . . . . . . . . . . . . . . . . 363 12.2.4 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365 12.2.5 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374 12.2.6 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 12.3 Tecniche alternative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 12.3.1 Alternative alle code di messaggi . . . . . . . . . . . . . . . . . . . . . . . 395 12.3.2 I file di lock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 12.3.3 La sincronizzazione con il file locking . . . . . . . . . . . . . . . . . . . . . 397 12.3.4 Il memory mapping anonimo . . . . . . . . . . . . . . . . . . . . . . . . . 399 12.4 Il sistema di comunicazione fra processi di POSIX . . . . . . . . . . . . . . . . . 399 12.4.1 Considerazioni generali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 12.4.2 Code di messaggi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400 12.4.3 Memoria condivisa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406 12.4.4 Semafori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409 13 I thread 415 13.1 Introduzione ai thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 13.1.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 13.1.2 I thread e Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 13.1.3 Implementazioni alternative . . . . . . . . . . . . . . . . . . . . . . . . . . 415 13.2 Posix thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 13.2.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 13.2.2 La gestione dei thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 13.2.3 I mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 13.2.4 Le variabili di condizione . . . . . . . . . . . . . . . . . . . . . . . . . . . 416 II Programmazione di rete 417 14 Introduzione alla programmazione di rete 419 14.1 Modelli di programmazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 14.1.1 Il modello client-server . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 14.1.2 Il modello peer-to-peer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 14.1.3 Il modello three-tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420 14.2 I protocolli di rete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 14.2.1 Il modello ISO/OSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 14.2.2 Il modello TCP/IP (o DoD) . . . . . . . . . . . . . . . . . . . . . . . . . . 422 14.2.3 Criteri generali dell’architettura del TCP/IP . . . . . . . . . . . . . . . . 424 14.3 Il protocollo TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 14.3.1 Il quadro generale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 14.3.2 Internet Protocol (IP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 INDICE ix 14.3.3 User Datagram Protocol (UDP) . . . . . . . . . . . . . . . . . . . . . . . 428 14.3.4 Transport Control Protocol (TCP) . . . . . . . . . . . . . . . . . . . . . . 429 14.3.5 Limiti e dimensioni riguardanti la trasmissione dei dati . . . . . . . . . . 429 15 Introduzione ai socket 433 15.1 Una panoramica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 15.1.1 I socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 15.1.2 Concetti base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433 15.2 La creazione di un socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 15.2.1 La funzione socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 15.2.2 Il dominio dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 15.2.3 Il tipo di socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 15.3 Le strutture degli indirizzi dei socket . . . . . . . . . . . . . . . . . . . . . . . . . 437 15.3.1 La struttura generica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 15.3.2 La struttura degli indirizzi IPv4 . . . . . . . . . . . . . . . . . . . . . . . 438 15.3.3 La struttura degli indirizzi IPv6 . . . . . . . . . . . . . . . . . . . . . . . 439 15.3.4 La struttura degli indirizzi locali . . . . . . . . . . . . . . . . . . . . . . . 440 15.3.5 La struttura degli indirizzi AppleTalk . . . . . . . . . . . . . . . . . . . . 440 15.3.6 La struttura degli indirizzi dei packet socket . . . . . . . . . . . . . . . . . 440 15.4 Le funzioni di conversione degli indirizzi . . . . . . . . . . . . . . . . . . . . . . . 442 15.4.1 La endianess . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442 15.4.2 Le funzioni per il riordinamento . . . . . . . . . . . . . . . . . . . . . . . 444 15.4.3 Le funzioni inet_aton, inet_addr e inet_ntoa . . . . . . . . . . . . . . 444 15.4.4 Le funzioni inet_pton e inet_ntop . . . . . . . . . . . . . . . . . . . . . 445 16 I socket TCP 447 16.1 Il funzionamento di una connessione TCP . . . . . . . . . . . . . . . . . . . . . . 447 16.1.1 La creazione della connessione: il three way handshake . . . . . . . . . . . 447 16.1.2 Le opzioni TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 16.1.3 La terminazione della connessione . . . . . . . . . . . . . . . . . . . . . . 449 16.1.4 Un esempio di connessione. . . . . . . . . . . . . . . . . . . . . . . . . . . 450 16.1.5 Lo stato TIME_WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 16.1.6 I numeri di porta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 16.1.7 Le porte ed il modello client/server . . . . . . . . . . . . . . . . . . . . . . 455 16.2 Le funzioni di base per la gestione dei socket . . . . . . . . . . . . . . . . . . . . 456 16.2.1 La funzione bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 16.2.2 La funzione connect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458 16.2.3 La funzione listen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459 16.2.4 La funzione accept . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 16.2.5 Le funzioni getsockname e getpeername. . . . . . . . . . . . . . . . . . . 462 16.2.6 La funzione close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464 16.3 Un esempio elementare: il servizio daytime . . . . . . . . . . . . . . . . . . . . . . 464 16.3.1 Il comportamento delle funzioni di I/O. . . . . . . . . . . . . . . . . . . . 464 16.3.2 Il client daytime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465 16.3.3 Un server daytime iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . 468 16.3.4 Un server daytime concorrente . . . . . . . . . . . . . . . . . . . . . . . . 470 16.4 Un esempio piu` completo: il servizio echo . . . . . . . . . . . . . . . . . . . . . . 472 16.4.1 Il servizio echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 16.4.2 Il client echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 473 16.4.3 Il server echo: prima versione . . . . . . . . . . . . . . . . . . . . . . . . . 474 16.4.4 L’avvio e il funzionamento normale . . . . . . . . . . . . . . . . . . . . . . 477 x INDICE 16.4.5 La conclusione normale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478 16.4.6 La gestione dei processi figli . . . . . . . . . . . . . . . . . . . . . . . . . . 479 16.5 I vari scenari critici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482 16.5.1 La terminazione precoce della connessione . . . . . . . . . . . . . . . . . . 483 16.5.2 La terminazione precoce del server . . . . . . . . . . . . . . . . . . . . . . 484 16.5.3 Altri scenari di terminazione della connessione . . . . . . . . . . . . . . . 488 16.6 L’uso dell’I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 16.6.1 Il comportamento della funzione select con i socket. . . . . . . . . . . . 491 16.6.2 Un esempio di I/O multiplexing . . . . . . . . . . . . . . . . . . . . . . . 492 16.6.3 La funzione shutdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 16.6.4 Un server basato sull’I/O multiplexing . . . . . . . . . . . . . . . . . . . . 499 16.6.5 I/O multiplexing con poll . . . . . . . . . . . . . . . . . . . . . . . . . . 502 17 La gestione dei socket 507 17.1 La risoluzione dei nomi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 17.1.1 La struttura del resolver . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 17.1.2 Le funzioni di interrogazione del resolver . . . . . . . . . . . . . . . . . . 509 17.1.3 La risoluzione dei nomi a dominio . . . . . . . . . . . . . . . . . . . . . . 515 17.1.4 Le funzioni avanzate per la risoluzione dei nomi . . . . . . . . . . . . . . . 522 17.2 Le opzioni dei socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532 17.2.1 Le funzioni setsockopt e getsockopt . . . . . . . . . . . . . . . . . . . . 533 17.2.2 Le opzioni generiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535 17.2.3 L’uso delle principali opzioni dei socket . . . . . . . . . . . . . . . . . . . 539 17.2.4 Le opzioni per il protocollo IPv4 . . . . . . . . . . . . . . . . . . . . . . . 545 17.2.5 Le opzioni per i protocolli TCP e UDP . . . . . . . . . . . . . . . . . . . 549 17.3 La gestione attraverso le funzioni di controllo . . . . . . . . . . . . . . . . . . . . 555 17.3.1 L’uso di ioctl e fcntl per i socket generici . . . . . . . . . . . . . . . . . 556 17.3.2 L’uso di ioctl per l’accesso ai dispositivi di rete . . . . . . . . . . . . . . 557 17.3.3 L’uso di ioctl per i socket TCP e UDP . . . . . . . . . . . . . . . . . . . 561 17.4 La gestione con sysctl ed il filesystem /proc . . . . . . . . . . . . . . . . . . . . 562 17.4.1 L’uso di sysctl e /proc per le propriet`a della rete . . . . . . . . . . . . . 562 17.4.2 I valori di controllo per i socket generici . . . . . . . . . . . . . . . . . . . 563 17.4.3 I valori di controllo per il protocollo IPv4 . . . . . . . . . . . . . . . . . . 564 18 Gli altri tipi di socket 573 18.1 I socket UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573 18.1.1 Le caratteristiche di un socket UDP . . . . . . . . . . . . . . . . . . . . . 573 18.1.2 Le funzioni sendto e recvfrom . . . . . . . . . . . . . . . . . . . . . . . . 574 18.1.3 Un client UDP elementare . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 18.1.4 Un server UDP elementare . . . . . . . . . . . . . . . . . . . . . . . . . . 578 18.1.5 Le problematiche dei socket UDP . . . . . . . . . . . . . . . . . . . . . . . 580 18.1.6 L’uso della funzione connect con i socket UDP . . . . . . . . . . . . . . . 584 18.2 I socket Unix domain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 18.2.1 Il passaggio di file descriptor . . . . . . . . . . . . . . . . . . . . . . . . . 585 18.3 Altri socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 18.3.1 I socket raw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 18.3.2 I socket netlink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 18.3.3 I packet socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586
Description: