Il progetto

GaPiL nasce dalla mia convinzione profonda che la “filosofia” che ispira il software libero si applichi anche ad altri campi che non siano necessariamente quelli della scrittura di programmi per computer. In particolare ritengo che possa assumere una grande rilevanza in ambiti come quelli dell’educazione e della formazione.

Ma se trovare della buona documentazione libera, specie per quanto riguarda i programmi che girano sul sistema GNU/Linux, è ormai relativamente facile, la produzione di buoni testi didattici che insegnino a programmare in questo sistema è ancora molto limitata, soprattutto se li si cercano in lingua italiana.

GaPiL è un tentativo di scrivere un manuale di programmazione di sistema in ambiente di tipo Unix, con una particolare attenzione alle caratteristiche specifiche delle interfacce fornite dal kernel Linux. Per questo motivo si parla di Linux e non di GNU/Linux.

Nonostante questa specificità, essendo la gran parte delle funzioni di sistema standardizzate, la guida dovrebbe risultare utile anche facendo riferimenti ad altri sistemi di tipo Unix come i vari *BSD; in ogni caso si sono sottolineate esplicitamente le caratteristiche specifiche di Linux.

Benché buona parte della trattazione delle funzioni di libreria sia del tutto identica, facendo riferimento a standard generali come POSIX, si è comunque prestata particolare attenzione alle funzioni delle GNU libc, che sono la versione più usata delle librerie del C, senza dimenticare, ove note, di citare le differenze con possibili alternative come le libc5 o le uclibc.

L’obiettivo resta comunque quello di riuscire a produrre un testo, rilasciato sotto GNU FDL, che possa servire a chi si accosta per la prima volta alla programmazione avanzata e di sistema su un kernel Linux, con la speranza di poter un giorno raggiungere la qualità dei lavori del compianto R. W. Stevens.

Share

Revisione nono capitolo.

E’ stata completata la revisione del precedente nono capitolo, dedicato ai meccanismi di intercomunicazione fra processi, che è diventato il decimo per lo spostamento a seguire di quello sulla gestione avanzata dei file (che è ancora da rivedere).

E’ stata aggiornata tutta la parte sulle pipe aggiungendo la funzione di sistema pipe2 e si è documentato l’uso del close-on-exec e della modalità non-bloccante sia per le pipe che per la funzione socketpair

Si è migliorata l’introduzione al SysV-IPC, con degli esempi più precisi e la revisione dell’introduzione. E’ stata completamente revisionata la trattazione dell’IPC POSIX, aggiornando le varie funzioni dell’interfaccia alle versioni presenti nei kernel recenti, in particolare per quanto riguarda le code di messaggi ed i semafori.

Share

Completa la revisione del capitolo 8

Grazie al ponte del 25 aprile ed al 1° maggio ho avuto un po’ di tempo per completare la revisione del capitolo 8 (nuovo numero dopo la revisione) dedicato a sessioni e terminali. Non ci sono aggiunte significative, ma solo un po’ di aggiornamenti e svecchiamenti, ed una serie di correzioni. Rispetto all’ultima edizione è comunque presente la documentazione del syslog e di klogctl (l’interfaccia per l’accesso al ring buffer di printk).

Share

Nuovo settimo capitolo

La revisione del nuovo settimo capitolo dedicato ai segnali, (il precedente nono, prima degli accorpamenti) è stata completata.

E’ stata completamente rivista la classificazione dei segnali aggiornando i dati e correggendo alcune imprecisioni (alcune correzioni sono state inviate anche al manutentore delle man pages relative).

Si sono aggiornate le funzioni di gestione delle maschere dei segnali. Sono stati inseriti gli aggiornamenti relativi ai nuovi orologi Posix introdotti nei kernel più recenti. Si è aggiunta la trattazione di clock_nanosleep.

 

Share

Nuovo sesto capitolo

La revisione del nuovo sesto capitolo (il precedente ottavo, prima degli accorpamenti) è stata completata. Dopo la rimozione della parte sulla gestione dei filesystem, spostata all’inizio del quarto capitolo, si è ristrutturato il resto dei contenuti. In particolare:

  • si è spostata la parte su sysctl e /proc nella prima sezione, dove era più in argomento. La trattazione della system call sysctl, ormai totalmente deprecata, è stata rimossa, e si è leggermente ampliata quella di /proc.
  • si è rivista la seconda sezione sul sistema in generale aggiungendo una sezione su spegnimento e riavvio, trattando reboot e kexec_load.
  • si è aggiornata la trattazione dei limiti sulle risorse inserendo le nuove risorse introdotte fino ai kernel correnti e la system call prlimit
  • si è rivista la trattazione dei tempi e le relative funzioni, accorpando i dati relativi a jiffies, HZ, clock tick, ecc.
Share

Nuovo quinto capitolo, parte seconda

E’ stata completata la revisione della seconda parte del quinto capitolo, che tratta l’interfaccia ANSI C per i file (quella denominata dei file stream). Si tratta della parte accorpata alla trattazione base dei file descriptor che costituiva il precedente settimo capitolo.

Si sono riorganizzati gli argomenti con una migliore suddivisione dei paragrafi e dei titoli più appropriati, e si è fatta una revisione generale dei contenuti, ma non sono state effettuate aggiunte significative.

Share

Nuovo quinto capitolo, parte prima

Nella revisione della guida si è deciso di accorpare i due capitoli in precedenza dedicati alle due interfacce di programmazione per l’accesso al contenuto dei file, quella dei file descriptor e quella degli stream, in un unico capitolo, il quinto, dedicato alla gestione del contenuto dei file in maniera generale.

Si sono ristrutturate le varie sezioni dedicando a ciascuna interfaccia due sezioni, di cui la prima volta ad illustrare architettura e funzioni di base, e la seconda volta ad illustrare le caratteristiche più avanzate di entrambe. Si è inoltre provveduto ad un aggiornamento dei contenuti, che è stato completato per quanto riguarda la prima parte, quella dedicata alla interfaccia nativa Unix dei file descriptor.

Si è revisionata la spiegazione sul significato dei file descriptor, si sono documentati in maniera dettagliata i flag di open, in particolare O_DIRECT e O_SYNC, si sono documentati i nuovi parametri SEEK_HOLE e SEEK_DATA di lseek, si sono accorpate le sezioni relative all’accesso concorrente dei processi ai file e documentati i dettagli non standard di dup2 e della nuova dup3. Si sono documentati meglio i comandi di fcntl ed aggiunti i nuovi comandi introdotti negli ultimi anni come F_GETOWN_EX, F_SETOWN_EX, F_SETPIPE_SZ e F_GETPIPE_SZ.

Share

Nuovo quarto capitolo

La revisione del nuovo quarto capitolo dedicato alla gestione di file e directory (il cui contenuto deriva principalmente dal precedente quinto capitolo), è stata completata. Come già detto in precedenza il nuovo capitolo assorbe nella sua prima sezione parte dei contenuti della versione precedente e molto materiale aggiunto per l’occasione.

Oltre a questo però è stata ristrutturata la suddivisione della seconda sezione sulla gestione dei “nomi” dei file (nel senso gestione delle voci di una directory) accorpando gli argomenti attinenti e cambiandone il nome, e sono state revisionate dettagliatamente tutte le sezioni successive.

Si è infine scritto un nuovo programma di esempio per l’uso delle funzioni delle ACL (mygetfacl.c) e revisionato quello per la lettura delle capabilities.

Share

Revisione dell’introduzione a file e directory

Nella revisione del testo iniziata con le vacanze natalizie, e che procederà lentamente nei prossimi mesi, il precedente quarto capitolo, L’architettura dei file, è stato completamente eliminato.

Trattandosi di una introduzione all’architettura dei file una prima metà dei contenuti (quella di carattere più generale, con i tipi di file, l’albero unico e il significato dei pathname) stati riportati più correttamente all’inizio nel primo capitolo, in una nuova sezione aggiunta fra le due precedenti, volta ad illustrare a grandi linee l’architettura della gestione dei file in un sistema unix-like.

La parte finale del capitolo, dedicata al funzionamento del Virtual File System di Linux (dentry, inode, ecc.) e alla descrizione della strutturazione generica di un filesystem per Linux è invece stata inserita in una nuova sezione iniziale di quello che era il precedente capitolo 5, cui si è aggiunta, essendo strettamente correlata, la parte relativa alla system call mount che in precedenza era trattata molto più avanti, nella sezione sulla gestione del sistema.

Tutte queste parti, essendo alquanto datate, sono state riviste profondamente, se non addirittura, come fatto per la sezione dedicata al funzionamento del Virtual File System, riscritte da zero. Inoltre nella aggiunta della parte relativa alla system call mount si sono trattate in dettaglio alcune delle opzioni avanzate introdotte nei kernel più recenti, come il bind mount e gli shared subtree. In particolare si sono cercate di trattare queste ultime, che al momento non sono documentate neanche nelle pagine di manuale della system call.

PS
Per eseguire un test diretto dei vari flag si è scritto un semplice programma per l’invocazione diretta della della system call mount, che consente di indicare, senza nessun controllo sulla correttezza della stessa, una qualunque combinazione di flag di montaggio. Il programma passa direttamente anche gli altri argomenti della funzione (opzioni del filesystem, tipo del filesystem, sorgente e target)

Il codice del comando è disponibile nel file mymount.c, lanciato con l’opzione -h stampa una breve spiegazione, i vari mount flags si specificano con una lista di nomi seprati da virgole per l’opzione -f. I nomi sono quelli dei corrispondenti flag MS_* togliendo il suffisso MS_ e mettendoli in minuscolo. Il programma è stato anche un buon esercizio sulle funzioni di ricerca sulle stringhe della glibc.

Share

Revisione terzo capitolo

La revisione del terzo capitolo sulle funzioni di gestione dei processi è stata completata.

Si è aggiornata la parte sull’ordine di esecuzione dei processi dopo una fork, si sono aggiunti brevi cenni e i relativi rimandi al numero di argomenti che si possono passare con una exec, si è aggiornata la trattazione di nice con le differenza introdotte nelle ultime versioni dello scheduler, in particolare riguardo le time slice,e si sono trattate tutte le macro per la gestione dei CPU set.

La trattazione della system call clone e la parte finale del capitolo con le funzioni avanzate è ancora incompleta.

Share

Rivisti i capitoli 1 e 2

La revisione dei primi due capitoli della guida è stata completata. In particolare il secondo capitolo ha visto una serie di risistemazioni con l’accorpamento e la ristrutturazione di alcune sezioni. Si è spiegata con maggior dettaglio la differenza fra system call e chiamate a funzioni ed il ruolo del link-loader ed il significato di variabili automatiche, globali, statiche ecc.

Si è migliorata la sezione sulla allocazione della memoria con delle correzioni ad alcune imprecisioni ed una più chiara esposizione del layout della memoria di un processo, si sono aggiornate le sezioni sulle funzioni variadic e le variabili di ambiente. La sezione sulla localizzazione resta incompleta.

Share
This work by Simone Piccardi is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported.