ebook img

Guida alla Programmazione in Linux PDF

677 Pages·2008·7.72 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 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:
section entitled “GNU Free Documentation License”. specifico argomento in esame (ed in particolare lo GNU C Library Reference Manual non brilla filosofico. Il testo sar`a, almeno inizialmente, in italiano. Per il momento lo si `e suddiviso in due parti, la prima sulla programmazione di sistem
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.