ebook img

Guida alla Programmazione in Linux PDF

713 Pages·2010·8.19 MB·Italian
by  
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Guida alla Programmazione in Linux

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:
16.5.2 La terminazione precoce del server . specifico argomento in esame (ed in particolare lo GNU C Library Reference Manual non brilla .. di documentazioni e specifiche sotto il nome di X/Open Portability Guide a cui di
See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.