Next:
.
Indice
Indice analitico
Imparare il C
una guida per Linux
V. 1.7
Marco Latini - Paolo Lulli
14. febbraio 2005
.
copyright
.
Gli autori
Marco Latini
Paolo Lulli
Indice
Progetto EDU di OS3
Cos'è il Progetto EDU
EDU e la divulgazione
EDU e il modello del
Software Libero
La licenza di distribuzione di EDU
I perchè del Progetto EDU
Costi dei libri di testo
Consultazione di parti di libro e fotocopie
Nuove edizioni delle case editrici
Contributi esterni al progetto EDU
Sito ufficiale del Progetto EDU
L'azienda OS3
Un primo approccio
Introduzione
Due parole sul
C
Il necessario
Tutti gli strumenti
Iniziare
Il primo programma
I commenti
Gli include
il Main
printf()
: una funzione
Il secondo programma
Le caratteristiche standard del linguaggio
Operatori e istruzioni di controllo
Gli operatori
Precisazioni sulle operazioni di logica booleana
L'operazione di casting
L'istruzione condizionale
if
Un'alternativa scarna: gli operatori
? :
Scelte multiple con
switch
Il ciclo
while
Il ciclo
do... while
Il ciclo
for
Il famigerato
goto
Tipi di dati complessi
Array
Passare parametri al
main
Strutture e unioni
Una utile estensione delle struct: I campi di bit
La keyword
typedef
I puntatori
Alcune considerazioni
Dichiarazione di un puntatore
Operatori sui puntatori
Input e Output su file
Definizione ed uso delle funzioni
Funzioni definite dall'utente
I puntatori a funzione
Gli header standard ANSI e le funzioni di libreria
assert.h
ctype.h
errno.h
float.h
limits.h
locale.h
math.h
setjmp.h
signal.h
stdarg.h
stddef.h
stdio.h
stdlib.h
string.h
time.h
Compilazione separata
Allocazione dinamica della memoria
Allocazione dinamica della memoria
La funzione
malloc()
La funzione
free()
Che cosa sono le strutture dati e a cosa servono
Le pile: LIFO
Le code: FIFO
Le liste
Liste a concatenamento semplice
Tempo
Lo standard c99
Introduzione
C89 VS C99
Aggiunte
Rimozioni
Modifiche
inline
restrict
il tipo
_Bool
_Complex
ed
_Imaginary
Array di lunghezza variabile
Array flessibili come membri delle strutture
Aggiunte al preprocessore
Macro con argomenti in numero variabile
L'operatore
_Pragma
Aggiunta di nuove macro
I letterali composti
Il tipo long long int
Il commento //
Dichiarazione di una variabile in un'istruzione
for
Amalgamare codice e dati
Inizializzatori designati
Usare i tipi long long int
Identificatore di funzione
__func__
Altre modifiche ed aggiunte
Nuove librerie
Notevole incremento dei limiti di traduzione
Programmazione in ambiente Linux/Unix
GDB
Errori sintattici ed errori logici
Una compilazione "dedicata"
GDB: avvio
Input ed Output del programma
Step by Step
Breakpoints
Watchpoints
Una volta bloccata l'esecuzione...
Andare avanti
Sessione d'esempio
Codice C
Sessione GDB
Uso avanzato del GDB
Modificare il valore delle variabili
Analisi dello Stack
Stack frames
Backtraces
Vagare per i frames :-D
Ricavare informazioni riguardanti il frame
Esami approfonditi del programma
Sessione d'esempio
Il Codice sorgente
Analisi dello stack e della memoria
GDB ancora più velocemente
conclusioni
In breve: utilizzo di
make
makefile
Gestione elementare del colore
Errori
La variabile
errno
Funzioni per la gestione degli errori
La funzione
strerror
La funzione
perror
La funzione
error
Utenti e Gruppi
Introduzione
UID e GID
Un processo, una persona
Cambiare la persona
Conoscere gli ID di un processo
La funzione
getuid
La funzione
getgid
La funzione
geteuid
La funzione
getegid
Un semplice esempio
Modificare gli ID
La funzione
seteuid
La funzione
setuid
La funzione
setegid
La funzione
Function: int setgid (gid_t NEWGID)
Chi sta facendo cosa...
La funzione
getlogin
Un pò di codice
L'user account database
Il tipo di dato
struct exit_status
Il tipo di dato
Data Type: struct utmp
Funzioni importanti
La funzione
setutent
La funzione
endutent
La funzione
getutent
La funzione
getutent_r
La funzione
getutid
La funzione
getutid_r
La funzione
getutline
La funzione
getutline_r
La funzione
pututline
La funzione
utmpname
Lo User Database
Il tipo di dato:
struct passwd
Funzioni importanti
La funzione
getpwuid
La funzione
getpwuid_r
La funzione
getpwnam
La funzione
getpwnam_r
La funzione
fgetpwent
La funzione
fgtpwent_r
La funzione
setpwent
La funzione
getpwent
La funzione
getpwent_r
La funzione
endpwent
La funzione
putpwent
Il Group Database
Il tipo di dato:
struct group
Funzioni importanti
La funzione
getgrgid
La funzione
getgrgid_r
La funzione
getgrnam
La funzione
getgrnam_r
La funzione
fgetgrent
La funzione
fgetgrent_r
La funzione
setgrent
La funzione
getrent
La funzione
getrent_r
La funzione
endgrent
Altri database
Esercizi
File System
Introduzione
Concetti di base dell'I/O
Streams piú in dettaglio
La funzione
fopen
La funzione
freopen
La funzione
__freadable
La funzione
__fwritable
La funzione
fclose
La funzione
fcloseall
Posizionarsi all'interno di un file
La funzione
ftell
La funzione
fseek
La funzione
rewind
Directories: funzioni importanti
La funzione
getcwd
La funzione
chdir
La funzione
fchdir
Lavorare con le directory
Funzioni Importanti
La funzione
opendir
La funzione
readdir
La funzione
readdir_r
La funzione
closedir
Un piccolo esempio
La funzione
rewinddir
La funzione
telldir
La funzione
seekdir
La funzione
scandir
Alberi di directories
Tipi di dato
La funzione
ftw
La funzione
nftw
Links
Funzioni relative agli
hard links
La funzione
link
Funzioni relative ai
soft links
La funzione
symlink
La funzione
readlink
La funzione
canonicalize_file_name
Rinominare i files
La funzione
canonicalize_file_name
Creazione di directories
La funzione
mkdir
Cancellare i files
La funzione
unlink
La funzione
rmdir
La funzione
remove
Gli attributi dei files
La struttura
stat
La funzione
stat
La funzione
fstat
La funzione
lstat
Utilizzare le informazioni
La macro
S_ISDIR
La macro
La macro
S_ISBLK
La macro
S_ISREG
La macro
S_ISFIFO
La macro
S_ISLNK
La macro
S_ISSOK
La macro
S_TYPEISMQ
La macro
S_TYPEISSEM
La macro
S_TYPEISSHM
Questioni di sicurezza
La funzione
chown
La funzione
fchown
La funzione
chmod
La funzione
fchmod
Un piccolo esempio
La funzione
access
Tempi
Il tipo di dato
struct utimbuf
La funzione
utime
Dimensioni
La funzione
truncate
La funzione
ftruncate
Files speciali
La funzione
mknod
Input/Output di Alto Livello
Introduzione
I/O e Threads
La funzione
flockfile
La funzione
ftrylockfile
La funzione
funlockfile
funzioni di Output
La funzione
fputc
La funzione
fputc_unlocked
La funzione
putc
La funzione
putc_unlocked
La funzione
putchar
La funzione
putchar_unlocked
La funzione
fputs
La funzione
fputs_unlocked
La funzione
puts
La funzione
fwrite
La funzione
fwrite_unlocked
Funzioni di Input
La funzione
fgetc
La funzione
fgetc_unlocked
La funzione
getc
La funzione
getc_unlocked
La funzione
getchar
La funzione
getchar_unlocked
La funzione
fread
La funzione
fread_unlocked
EOF
La funzione
feof
La funzione
feof_unlocked
La funzione
ferror
La funzione
ferror_unlocked
Buffering
La funzione
fflush
La funzione
fflush_unlocked
La funzione
__fpurge
La funzione
setvbuf
La funzione
__flbf
La funzione
__fbufsize
La funzione
__fpending
I/O di basso livello
Apertura e Chiusura di un file
La funzione
open
La funzione
close
Lettura e scrittura
La funzione
read
La funzione
pread
La funzione
write
La funzione
pwrite
Posizionamento
La funzione
lseek
Da basso ad alto livello e viceversa
La funzione
fdopen
La funzione
fileno
I/O su più buffer
La struttura
iovec
La funzione
readv
La funzione
writev
Mappare i files in memoria
La funzione
mmap
La funzione
msync
La funzione
mremap
La funzione
munmap
Processi
Introduzione
Generazione e gestione di processi
La funzione system()
La funzione
fork()
Impiego di pipe nei programmi
Le funzioni della classe "exec"
Code di messaggi
inoltrare e ricevere i messaggi
Memoria condivisa
Named pipe e FIFO
Segnali
Introduzione
Generazione dei segnali
La funzione
raise
La funzione
kill
Gestione dei segnali
La funzione
signal
La funzione
sigaction
Un pò di codice
Uso di
signal()
Bloccare i Segnali
Funzioni relative al blocco dei segnali
La funzione
sigemptyset
La funzione
sigfillset
La funzione
sigaddset
La funzione
sigdelset
La funzione
sigismemeber
La funzione
sigprocmask
La funzione
sigpending
Aspetti importanti: accesso atomico ai dati.
Attesa di un Segnale
La funzione
sigsuspend
Threads
Introduzione
Caratteristiche dei threads
Threads VS Processi
Funzioni per la programmazione Multithreading
La funzione
pthread_create
La funzione
pthread_exit
La funzione
pthread_join
La funzione
pthread_cancel
Un pò di codice
Comunicazione e prime problematiche
Meccanismi di mutua esclusione (Mutex)
Funzioni per la programmazione Multithreading
La funzione
pthread_mutex_init
La funzione
int pthread_mutex_lock
La funzione
int pthread_mutex_trylock
La funzione
pthread_mutex_timedlock
La funzione
pthread_mutex_unlock
La funzione
pthread_mutex_destroy
Un pò di codice
Il problema...
...La soluzione
Condizioni
La funzione
pthread_cond_init
La funzione
pthread_cond_signal
La funzione
pthread_cond_broadcast
La funzione
pthread_cond_wait
La funzione
pthread_cond_timedwait
La funzione
pthread_cond_destroy
Un pò di codice
Semafori
La funzione
sem_init
La funzione
sem_wait
La funzione
int sem_trywait
La funzione
int sem_post
La funzione
int sem_getvalue
La funzione
int sem_destroy
Socket
Premessa
introduzione
Client e Server
Mica posso fare tutto io...
Chiamate per la programmazione di socket
La chiamata
socket
La chiamata
bind
La chiamata
listen
La chiamata
accept
La chiamata
connect
La chiamata
send
La chiamata
recv
Bytes ed Indirizzi
Strutture importanti.
struct in_addr
sockaddr_in
struct sockaddr
Un pò di codice
Server iterativo
Client d'esempio
Server concorrente
il codice
I/O non bloccante e Multiplexing
Socket Raw
Introduzione
Internet Protocol(IP)
Struttura del pacchetto IP
Vediamolo meglio
Costruzione di un pacchetto IP
Trasfer Control Protocol (TCP)
Struttura del TCP
Vediamolo meglio
Lo pseudo header
User Datagram Protocol (UDP)
Risorse di sistema
Introduzione
La struttura
rusage
Reperire le informazioni
La funzione
getrusage
Limitare l'accesso
Limiti
Strutture importanti
Funzioni per la gestione delle risorse
La funzione
getrlimit
La funzione
setrlimit
Elenco risorse
CPU
La funzione
get_nprocs_conf
La funzione
get_nprocs_conf
La funzione
getloadavg
Scheduling
Priorità di un processo
Policy di scheduling
Real time
Scheduling tradizionale
Funzioni per lo scheduling Real Time
La funzione
sched_setscheduler
La funzione
sched_getscheduler
La funzione
sched_setparam
La funzione
sched_getparam
La funzione
int sched_rr_get_interval
La funzione
sched_yield
Funzioni per lo scheduling tradizionale
La funzione
getpriority
La funzione
setpriority
Memoria
Introduzione
Memoria virtuale
Allocazione della memoria
Allocazione dinamica
Funzioni per l'allocazione dinamica
La funzione
malloc
La funzione
calloc
La funzione
realloc
La funzione
free
Locking della memoria
Funzioni per il Locking della memoria.
La funzione
mlock
La funzione
mlockall
La funzione
munlock
La funzione
munlockall
Ncurses
Introduzione
Cominciare
GTK minimalia
Secure Programming
La programmazione sicura
Introduzione
Pensare alla sicurezza
Il Principio del Minimo Privilegio
Il Principio della Sicurezza di Default
Il Principio della semplicità dei Meccanismi
Il Principio dell'Open Design
Il Principio del Check Completo
Il Principio del Minimo dei Meccanismi Comuni
Il Principio della Separazione dei Privilegi
Il Principio dell'Accettabilità Psicologica
Buffer Overflow
Introduzione
non lo so
Un piccolo esempio
Studio di un caso semplificato
Il codice incriminato
L'attacco
L'exploit
Lo
Shellcode
Un'uscita ``pulita''
Un problema
Codifica
Proteggersi dai Buffer Overflows
Funzioni sicure: pro
Funzioni sicure: contro
Allocazione dinamica della memoria
Kernel hijacking
Premessa
introduzione
da trovare il titolo
mettiamo insieme un pò di codice
Kernel Programming
Introduzione
Sistemi Operativi e Kernel
E Linux?
Perché?
Il nostro primo modulo
Kernel Symbol Table
Appendici
Attributi dei Threads
Gestione degli attributi
La funzione
pthread_attr_init
La funzione
pthread_attr_destroy
La funzione
pthread_attr_setATTR
La funzione
pthread_attr_getATTR
Attributi piú importanti
Tipi di Segnale
Segnali di errore
Segnali di terminazione
Segnali di allarme
Segnali asincroni
Segnali per il controllo dei processi
Errori generati da operazioni
Vari
Stile di programmazione
Introduzione
Linux kernel coding style
Indentation
Placing Brace
Naming
Functions
Commenting
Data Structures
Tipi da Linux
types.h
Il rovescio della medaglia
Reti Neurali
Introduzione
Ma cos'è una rete neurale?
Neuronodi
un pò di codice
Apprendere: errare è solo umano?
Prendiamo l'argilla e sputiamoci sopra
L'input
Signori, l'uscita è da questa parte
Impariamo a fare le somme
La soluzione è...
Eseguire le modifiche
Test di valutazione
Conclusioni
Esercizi pratici
Esercizi teorici
Divertirsi con il codice: gli algoritmi storici della crittografia
L'algoritmo di Cesare
L'algoritmo di Vigenère
Il grosso guaio delle sostituzioni monoalfabetiche
Osservazioni di carattere generale
Argomenti da linea di comando
Argc e Argv
Convenzioni POSIX
Parsing delle opzioni
La funzione
getopt
Esempio
La funzione
getopt_long
Esempio
Utilizzare ARGP
La struttura argp_option
Copyright
GNU Free Documentation License
History
Ringraziamenti
TODO
Indice analitico
About this document ...
2005-02-14