p. 1
gapil guida alla programmazione in linux simone piccardi 25 luglio 2010
[close]
p. 2
ii copyright 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 frontcover texts and with no back-cover texts a copy of the license is included in the section entitled gnu free documentation license
[close]
p. 3
indice un preambolo prefazione xiii xv i programmazione di sistema 1 3 3 3 4 5 6 7 7 8 9 10 10 11 12 17 17 17 18 18 19 20 20 20 21 23 27 30 32 32 33 35 38 1 l architettura del sistema 1.1 una panoramica 1.1.1 concetti base 1.1.2 il kernel e il sistema 1.1.3 chiamate al sistema e librerie di funzioni 1.1.4 un sistema multiutente 1.2 gli standard 1.2.1 lo standard ansi c 1.2.2 i tipi di dati primitivi 1.2.3 lo standard system v 1.2.4 lo standard bsd 1.2.5 gli standard ieee posix 1.2.6 gli standard x/open opengroup unix 1.2.7 il controllo di aderenza agli standard 2 l interfaccia base con i processi 2.1 esecuzione e conclusione di un programma 2.1.1 la funzione main 2.1.2 come chiudere un programma 2.1.3 le funzioni exit e _exit 2.1.4 le funzioni atexit e on_exit 2.1.5 conclusioni 2.2 i processi e l uso della memoria 2.2.1 i concetti generali 2.2.2 la struttura della memoria di un processo 2.2.3 allocazione della memoria per i programmi c 2.2.4 il controllo della memoria virtuale 2.2.5 gestione avanzata dell allocazione della memoria 2.3 argomenti ambiente ed altre propriet di un processo a 2.3.1 il formato degli argomenti 2.3.2 la gestione delle opzioni 2.3.3 le variabili di ambiente 2.3.4 la localizzazione iii .
[close]
p. 4
iv 2.4 problematiche di programmazione generica 2.4.1 il passaggio delle variabili e dei valori di ritorno 2.4.2 il passaggio di un numero variabile di argomenti 2.4.3 potenziali problemi con le variabili automatiche 2.4.4 il controllo di flusso non locale indice 38 38 39 41 41 45 45 45 47 48 48 49 55 57 62 66 66 68 71 73 73 74 77 81 83 86 86 87 87 89 89 89 90 91 92 92 94 95 97 101 101 101 104 105 108 109 110 117 3 la gestione dei processi 3.1 introduzione 3.1.1 l architettura della gestione dei processi 3.1.2 una panoramica sulle funzioni fondamentali 3.2 le funzioni di base 3.2.1 gli identificatori dei processi 3.2.2 la funzione fork e le funzioni di creazione dei processi 3.2.3 la conclusione di un processo 3.2.4 la funzione waitpid e le funzioni di ricezione degli stati di uscita 3.2.5 la funzione exec e le funzioni di esecuzione dei programmi 3.3 il controllo di accesso 3.3.1 gli identificatori del controllo di accesso 3.3.2 le funzioni di gestione degli identificatori dei processi 3.3.3 le funzioni per la gestione dei gruppi associati a un processo 3.4 la gestione della priorit dei processi a 3.4.1 i meccanismi di scheduling 3.4.2 il meccanismo di scheduling standard 3.4.3 il meccanismo di scheduling real-time 3.4.4 il controllo dello scheduler per i sistemi multiprocessore 3.4.5 le priorit per le operazioni di i/o a 3.5 problematiche di programmazione multitasking 3.5.1 le operazioni atomiche 3.5.2 le race condition ed i deadlock 3.5.3 le funzioni rientranti 4 l architettura dei file 4.1 l architettura generale 4.1.1 l organizzazione di file e directory 4.1.2 i tipi di file 4.1.3 le due interfacce ai file 4.2 l architettura della gestione dei file 4.2.1 il virtual file system di linux 4.2.2 il funzionamento del virtual file system 4.2.3 il funzionamento di un filesystem unix 4.2.4 i filesystem di uso comune 5 file e directory 5.1 la gestione di file e directory 5.1.1 le funzioni link e unlink 5.1.2 le funzioni remove e rename 5.1.3 i link simbolici 5.1.4 la creazione e la cancellazione delle directory 5.1.5 la creazione di file speciali 5.1.6 accesso alle directory 5.1.7 la directory di lavoro .
[close]
p. 5
indice 5.1.8 i file temporanei la manipolazione delle caratteristiche dei file 5.2.1 la lettura delle caratteristiche dei file 5.2.2 i tipi di file 5.2.3 le dimensioni dei file 5.2.4 i tempi dei file il controllo di accesso ai file 5.3.1 i permessi per l accesso ai file 5.3.2 i bit dei permessi speciali 5.3.3 le funzioni per la gestione dei permessi dei file 5.3.4 la gestione della titolarit dei file a 5.3.5 un quadro d insieme sui permessi caratteristiche e funzionalit avanzate a 5.4.1 la gestione delle capabilities 5.4.2 gli attributi estesi 5.4.3 le access control list 5.4.4 la funzione chroot v 118 121 121 122 123 124 128 128 131 132 135 136 137 137 145 150 159 161 161 161 162 163 163 166 166 168 169 170 170 171 173 174 175 178 180 183 183 183 184 184 184 185 186 188 189 190 192 194 198 5.2 5.3 5.4 6 i file l interfaccia standard unix 6.1 l architettura di base 6.1.1 l architettura dei file descriptor 6.1.2 i file standard 6.2 le funzioni base 6.2.1 la funzione open 6.2.2 la funzione close 6.2.3 la funzione lseek 6.2.4 le funzioni read e pread 6.2.5 le funzioni write e pwrite 6.3 caratteristiche avanzate 6.3.1 la condivisione dei files 6.3.2 operazioni atomiche con i file 6.3.3 le funzioni sync e fsync 6.3.4 le funzioni dup e dup2 6.3.5 le funzioni openat mkdirat e affini 6.3.6 la funzione fcntl 6.3.7 la funzione ioctl 7 i file l interfaccia standard ansi c 7.1 introduzione 7.1.1 i file stream 7.1.2 gli oggetti file 7.1.3 gli stream standard 7.1.4 le modalit di bufferizzazione a 7.2 funzioni base 7.2.1 apertura e chiusura di uno stream 7.2.2 lettura e scrittura su uno stream 7.2.3 input/output binario 7.2.4 input/output a caratteri 7.2.5 input/output di linea 7.2.6 l input/output formattato 7.2.7 posizionamento su uno stream .
[close]
p. 6
vi 7.3 funzioni avanzate 7.3.1 le funzioni di controllo 7.3.2 il controllo della bufferizzazione 7.3.3 gli stream e i thread indice 199 199 200 202 205 205 205 208 209 210 210 211 211 213 216 219 221 221 223 224 226 226 227 228 229 231 234 234 235 237 239 239 239 240 241 241 242 242 243 245 246 246 247 247 248 248 249 249 250 8 la gestione del sistema del tempo e degli errori 8.1 capacit e caratteristiche del sistema a 8.1.1 limiti e parametri di sistema 8.1.2 la funzione sysconf 8.1.3 i limiti dei file 8.1.4 la funzione pathconf 8.1.5 la funzione uname 8.2 opzioni e configurazione del sistema 8.2.1 la funzione sysctl ed il filesystem /proc 8.2.2 la gestione delle propriet dei filesystem a 8.2.3 la gestione delle informazioni su utenti e gruppi 8.2.4 il registro della contabilit degli utenti a 8.3 il controllo dell uso delle risorse 8.3.1 l uso delle risorse 8.3.2 limiti sulle risorse 8.3.3 le risorse di memoria e processore 8.3.4 la contabilit in stile bsd a 8.4 la gestione dei tempi del sistema 8.4.1 la misura del tempo in unix 8.4.2 la gestione del process time 8.4.3 le funzioni per il calendar time 8.4.4 la gestione delle date 8.5 la gestione degli errori 8.5.1 la variabile errno 8.5.2 le funzioni strerror e perror 8.5.3 alcune estensioni gnu 9 i segnali 9.1 introduzione 9.1.1 i concetti base 9.1.2 le semantiche del funzionamento dei segnali 9.1.3 tipi di segnali 9.1.4 la notifica dei segnali 9.2 la classificazione dei segnali 9.2.1 i segnali standard 9.2.2 segnali di errore di programma 9.2.3 i segnali di terminazione 9.2.4 i segnali di allarme 9.2.5 i segnali di i/o asincrono 9.2.6 i segnali per il controllo di sessione 9.2.7 i segnali di operazioni errate 9.2.8 ulteriori segnali 9.2.9 le funzioni strsignal e psignal 9.3 la gestione di base dei segnali 9.3.1 il comportamento generale del sistema 9.3.2 la funzione signal .
[close]
p. 7
indice 9.3.3 le funzioni kill e raise 9.3.4 le funzioni alarm abort ed i timer 9.3.5 le funzioni di pausa e attesa 9.3.6 un esempio elementare la gestione avanzata dei segnali 9.4.1 alcune problematiche aperte 9.4.2 gli insiemi di segnali o signal set 9.4.3 la funzione sigaction 9.4.4 la gestione della maschera dei segnali o signal mask 9.4.5 ulteriori funzioni di gestione 9.4.6 criteri di programmazione per i gestori dei segnali funzionalit avanzate a 9.5.1 i segnali real-time 9.5.2 la gestione avanzata delle temporizzazioni 9.5.3 le interfacce per la notifica attraverso i file descriptor vii 251 253 256 258 259 259 261 262 267 269 271 272 272 276 283 285 285 285 286 288 291 292 296 296 298 308 309 310 310 310 311 311 311 313 315 318 324 324 325 326 327 329 338 348 359 359 359 361 363 9.4 9.5 10 terminali e sessioni di lavoro 10.1 il job control 10.1.1 una panoramica introduttiva 10.1.2 i process group e le sessioni 10.1.3 il terminale di controllo e il controllo di sessione 10.1.4 dal login alla shell 10.1.5 prescrizioni per un programma daemon 10.2 l i/o su terminale 10.2.1 l architettura 10.2.2 la gestione delle caratteristiche di un terminale 10.2.3 la gestione della disciplina di linea 10.2.4 operare in modo non canonico 10.3 la gestione dei terminali virtuali 10.3.1 i terminali virtuali 10.3.2 allocazione dei terminale virtuali 11 la comunicazione fra processi 11.1 la comunicazione fra processi tradizionale 11.1.1 le pipe standard 11.1.2 un esempio dell uso delle pipe 11.1.3 le funzioni popen e pclose 11.1.4 le pipe con nome o fifo 11.1.5 la funzione socketpair 11.2 il sistema di comunicazione fra processi di system v 11.2.1 considerazioni generali 11.2.2 il controllo di accesso 11.2.3 gli identificatori ed il loro utilizzo 11.2.4 code di messaggi 11.2.5 semafori 11.2.6 memoria condivisa 11.3 tecniche alternative 11.3.1 alternative alle code di messaggi 11.3.2 i file di lock 11.3.3 la sincronizzazione con il file locking 11.3.4 il memory mapping anonimo .
[close]
p. 8
viii 11.4 il sistema di comunicazione fra processi di 11.4.1 considerazioni generali 11.4.2 code di messaggi 11.4.3 memoria condivisa 11.4.4 semafori posix indice 363 363 364 370 373 379 379 379 380 382 389 389 391 391 392 395 398 403 403 404 414 418 418 426 429 436 443 443 443 443 443 443 443 444 444 444 444 12 la gestione avanzata dei file 12.1 il file locking 12.1.1 l advisory locking 12.1.2 la funzione flock 12.1.3 il file locking posix 12.1.4 la funzione lockf 12.1.5 il mandatory locking 12.2 l i/o multiplexing 12.2.1 la problematica dell i/o multiplexing 12.2.2 le funzioni select e pselect 12.2.3 le funzioni poll e ppoll 12.2.4 l interfaccia di epoll 12.3 l accesso asincrono ai file 12.3.1 il signal driven i/o 12.3.2 i meccanismi di notifica asincrona 12.3.3 l interfaccia posix per l i/o asincrono 12.4 altre modalit di i/o avanzato a 12.4.1 file mappati in memoria 12.4.2 i/o vettorizzato readv e writev 12.4.3 l i/o diretto fra file descriptor sendfile e splice 12.4.4 gestione avanzata dell accesso ai dati dei file 13 i thread 13.1 introduzione ai thread 13.1.1 una panoramica 13.1.2 i thread e linux 13.1.3 la system call clone 13.1.4 implementazioni alternative 13.2 posix thread 13.2.1 una panoramica 13.2.2 la gestione dei thread 13.2.3 i mutex 13.2.4 le variabili di condizione ii programmazione di rete rete 445 447 447 447 448 448 449 449 450 14 introduzione alla programmazione di 14.1 modelli di programmazione 14.1.1 il modello client-server 14.1.2 il modello peer-to-peer 14.1.3 il modello three-tier 14.2 i protocolli di rete 14.2.1 il modello iso/osi 14.2.2 il modello tcp/ip o dod .
[close]
p. 9
indice 14.2.3 criteri generali dell architettura del tcp/ip 14.3 il protocollo tcp/ip 14.3.1 il quadro generale 14.3.2 internet protocol ip 14.3.3 user datagram protocol udp 14.3.4 transport control protocol tcp 14.3.5 limiti e dimensioni riguardanti la trasmissione dei dati 15 introduzione ai socket 15.1 una panoramica 15.1.1 i socket 15.1.2 concetti base 15.2 la creazione di un socket 15.2.1 la funzione socket 15.2.2 il dominio dei socket 15.2.3 il tipo di socket 15.3 le strutture degli indirizzi dei socket 15.3.1 la struttura generica 15.3.2 la struttura degli indirizzi ipv4 15.3.3 la struttura degli indirizzi ipv6 15.3.4 la struttura degli indirizzi locali 15.3.5 la struttura degli indirizzi appletalk 15.3.6 la struttura degli indirizzi dei packet socket 15.4 le funzioni di conversione degli indirizzi 15.4.1 la endianess 15.4.2 le funzioni per il riordinamento 15.4.3 le funzioni inet_aton inet_addr e inet_ntoa 15.4.4 le funzioni inet_pton e inet_ntop ix 452 452 453 455 456 456 457 461 461 461 461 462 462 463 464 465 465 466 467 468 468 469 470 470 472 472 473 475 475 475 476 477 478 480 481 483 484 484 486 487 489 490 492 492 492 493 496 498 500 16 i socket tcp 16.1 il funzionamento di una connessione tcp 16.1.1 la creazione della connessione il three way handshake 16.1.2 le opzioni tcp 16.1.3 la terminazione della connessione 16.1.4 un esempio di connessione 16.1.5 lo stato time_wait 16.1.6 i numeri di porta 16.1.7 le porte ed il modello client/server 16.2 le funzioni di base per la gestione dei socket 16.2.1 la funzione bind 16.2.2 la funzione connect 16.2.3 la funzione listen 16.2.4 la funzione accept 16.2.5 le funzioni getsockname e getpeername 16.2.6 la funzione close 16.3 un esempio elementare il servizio daytime 16.3.1 il comportamento delle funzioni di i/o 16.3.2 il client daytime 16.3.3 un server daytime iterativo 16.3.4 un server daytime concorrente 16.4 un esempio pi completo il servizio echo u .
[close]
p. 10
x 16.4.1 il servizio echo 16.4.2 il client echo prima versione 16.4.3 il server echo prima versione 16.4.4 l avvio e il funzionamento normale 16.4.5 la conclusione normale 16.4.6 la gestione dei processi figli 16.5 i vari scenari critici 16.5.1 la terminazione precoce della connessione 16.5.2 la terminazione precoce del server 16.5.3 altri scenari di terminazione della connessione 16.6 l uso dell i/o multiplexing 16.6.1 il comportamento della funzione select con i socket 16.6.2 un esempio di i/o multiplexing 16.6.3 la funzione shutdown 16.6.4 un server basato sull i/o multiplexing 16.6.5 i/o multiplexing con poll 17 la gestione dei socket 17.1 la risoluzione dei nomi 17.1.1 la struttura del resolver 17.1.2 le funzioni di interrogazione del resolver 17.1.3 la risoluzione dei nomi a dominio 17.1.4 le funzioni avanzate per la risoluzione dei nomi 17.2 le opzioni dei socket 17.2.1 le funzioni setsockopt e getsockopt 17.2.2 le opzioni generiche 17.2.3 l uso delle principali opzioni dei socket 17.2.4 le opzioni per il protocollo ipv4 17.2.5 le opzioni per i protocolli tcp e udp 17.3 la gestione attraverso le funzioni di controllo 17.3.1 l uso di ioctl e fcntl per i socket generici 17.3.2 l uso di ioctl per l accesso ai dispositivi di rete 17.3.3 l uso di ioctl per i socket tcp e udp 17.4 la gestione con sysctl ed il filesystem /proc 17.4.1 l uso di sysctl e /proc per le propriet della rete a 17.4.2 i valori di controllo per i socket generici 17.4.3 i valori di controllo per il protocollo ipv4 18 gli altri tipi di socket 18.1 i socket udp 18.1.1 le caratteristiche di un socket udp 18.1.2 le funzioni sendto e recvfrom 18.1.3 un client udp elementare 18.1.4 un server udp elementare 18.1.5 le problematiche dei socket udp 18.1.6 l uso della funzione connect con i socket udp 18.2 i socket unix domain 18.2.1 il passaggio di file descriptor 18.3 altri socket 18.3.1 i socket raw 18.3.2 i socket netlink indice 500 501 502 505 506 507 510 511 512 516 519 519 520 523 527 530 535 535 535 537 543 550 560 561 563 567 573 577 584 584 585 590 590 591 591 593 601 601 601 602 605 607 608 612 613 613 613 614 614 .
[close]
p. 11
indice xi 18.3.3 i packet socket 614 19 socket avanzati 19.1 le funzioni di i/o avanzate 19.1.1 la funzioni sendmsg e recvmsg 19.1.2 i messaggi ancillari 19.1.3 i dati urgenti o out-of-band 19.2 l uso dell i/o non bloccante 19.2.1 la gestione delle opzioni ip 615 615 615 615 616 616 616 iii appendici 617 619 619 619 621 622 622 623 623 624 625 626 626 627 628 629 629 630 631 632 632 633 633 634 635 635 636 636 636 636 a il livello di rete a.1 il protocollo ip a.1.1 introduzione a.1.2 l intestazione di ip a.1.3 le opzioni di ip a.2 il protocollo ipv6 a.2.1 i motivi della transizione a.2.2 principali caratteristiche di ipv6 a.2.3 l intestazione di ipv6 a.2.4 gli indirizzi di ipv6 a.2.5 la notazione a.2.6 la architettura degli indirizzi di ipv6 a.2.7 indirizzi unicast provider-based a.2.8 indirizzi ad uso locale a.2.9 indirizzi riservati a.2.10 multicasting a.2.11 indirizzi anycast a.2.12 le estensioni a.2.13 qualit di servizio a a.2.14 etichette di flusso a.2.15 priorit a a.2.16 sicurezza a livello ip a.2.17 autenticazione a.2.18 riservatezza a.2.19 auto-configurazione a.2.20 auto-configurazione stateless a.2.21 auto-configurazione stateful a.3 il protocollo icmp a.3.1 l intestazione di icmp b il livello di trasporto 639 b.1 il protocollo tcp 639 b.1.1 gli stati del tcp 639 b.2 il protocollo udp 639
[close]
p. 12
xii c i codici di errore c.1 gli errori dei file c.2 gli errori dei processi c.3 gli errori di rete c.4 errori generici indice 641 641 643 644 645 649 649 649 650 652 652 653 657 659 659 660 660 661 662 663 663 663 663 663 d gli strumenti di ausilio per la programmazione d.1 l uso di make per l automazione della compilazione d.1.1 introduzione a make d.1.2 utilizzo di make d.2 source control management d.2.1 introduzione a subversion d.2.2 utilizzo di svn e ringraziamenti f gnu free documentation license f.1 applicability and definitions f.2 verbatim copying f.3 copying in quantity f.4 modifications f.5 combining documents f.6 collections of documents f.7 aggregation with independent works f.8 translation f.9 termination f.10 future revisions of this license .
[close]
p. 13
un preambolo questa guida nasce dalla mia profonda convinzione che le istanze di libert e di condivisione a della conoscenza che hanno dato vita a quello straordinario movimento di persone ed intelligenza che va sotto il nome di software libero hanno la stessa rilevanza anche quando applicate alla produzione culturale in genere l ambito pi comune in cui questa filosofia viene applicata quello della documentazione u e perch´ il software per quanto possa essere libero se non accompagnato da una buona docue mentazione che aiuti a comprenderne il funzionamento rischia di essere fortemente deficitario riguardo ad una delle libert fondamentali quella di essere studiato e migliorato a ritengo inoltre che in campo tecnico ed educativo sia importante poter disporre di testi didattici come manuali enciclopedie dizionari ecc in grado di crescere essere adattati alle diverse esigenze modificati e ampliati o anche ridotti per usi specifici nello stesso modo in cui si fa per il software libero questa guida il mio tentativo di restituire indietro nei limiti di quelle che sono le mie e capacit un po della conoscenza che ho ricevuto mettendo a disposizione un testo che possa a fare da riferimento a chi si avvicina alla programmazione su linux nella speranza anche di trasmettergli non solo delle conoscenze tecniche ma anche un po di quella passione per la libert e la condivisione della conoscenza che sono la ricchezza maggiore che ho ricevuto a e come per il software libero anche in questo caso importante la possibilit di accedere ai e a sorgenti e non solo al risultato finale sia questo una stampa o un file formattato e la libert a di modificarli per apportarvi migliorie aggiornamenti ecc per questo motivo la free software foundation ha creato una apposita licenza che potesse giocare lo stesso ruolo fondamentale che la gpl ha avuto per il software libero nel garantire la permanenza delle libert date ma potesse anche tenere conto delle differenze che comunque ci a sono fra un testo ed un programma una di queste differenze che in un testo come in questa sezione possono venire espresse e quelle che sono le idee ed i punti di vista dell autore e mentre trovo che sia necessario permettere cambiamenti nei contenuti tecnici che devono essere aggiornati e corretti non vale lo stesso per l espressione delle mie idee contenuta in questa sezione che ho richiesto resti invariata il progetto pertanto prevede il rilascio della guida con licenza gnu fdl ed una modalit a di realizzazione aperta che permetta di accogliere i contributi di chiunque sia interessato tutti i programmi di esempio sono rilasciati con licenza gnu gpl xiii
[close]
p. 14
xiv un preambolo
[close]
p. 15
prefazione questo progetto mira alla stesura di un testo il pi completo e chiaro possibile sulla programmau zione di sistema su un kernel linux essendo i concetti in gran parte gli stessi il testo dovrebbe restare valido anche per la programmazione in ambito di sistemi unix generici ma resta una attenzione specifica alle caratteristiche peculiari del kernel linux e delle versioni delle librerie del c in uso con esso in particolare si dar ampio spazio alla versione realizzata dal progetto a gnu le cosiddette gnu c library o glibc che ormai sono usate nella stragrande maggioranza dei casi senza tralasciare l dove note le differenze con altre implementazioni come le libc5 o a le uclib l obiettivo finale di questo progetto quello di riuscire a ottenere un testo utilizzabile per e apprendere i concetti fondamentali della programmazione di sistema della stessa qualit dei libri a del compianto r w stevens un progetto molto ambizioso e infatti bench´ le pagine di manuale del sistema quelle che si accedono con il comando man e e il manuale delle librerie del c gnu siano una fonte inesauribile di informazioni da cui si costantemente attinto nella stesura di tutto il testo la loro struttura li rende totalmente e inadatti ad una trattazione che vada oltre la descrizione delle caratteristiche particolari dello specifico argomento in esame ed in particolare lo gnu c library reference manual non brilla per chiarezza espositiva per questo motivo si cercato di fare tesoro di quanto appreso dai testi di r w stevens in e particolare [1 e [2 per rendere la trattazione dei vari argomenti in una sequenza logica il pi u esplicativa possibile corredando il tutto quando possibile con programmi di esempio dato che sia il kernel che tutte le librerie fondamentali di gnu/linux sono scritte in c questo sar il linguaggio di riferimento del testo in particolare il compilatore usato per provare tutti i a programmi e gli esempi descritti nel testo lo gnu gcc il testo presuppone una conoscenza e media del linguaggio e di quanto necessario per scrivere compilare ed eseguire un programma a infine dato che lo scopo del progetto la produzione di un libro si scelto di usare l tex e e come ambiente di sviluppo del medesimo sia per l impareggiabile qualit tipografica ottenibile a che per la congruenza dello strumento con il fine tanto sul piano pratico quanto su quello filosofico il testo sar almeno inizialmente in italiano per il momento lo si suddiviso in due parti a e la prima sulla programmazione di sistema in cui si trattano le varie funzionalit disponibili per i a programmi che devono essere eseguiti su una singola macchina la seconda sulla programmazione di rete in cui si trattano le funzionalit per eseguire programmi che mettono in comunicazione a macchine diverse xv
[close]