Next:
Un primo approccio
Up:
Imparare il C una
Previous:
Paolo Lulli
Indice analitico
Indice
Un primo approccio
Introduzione
Due parole sul C
Il necessario
Tutti gli strumenti
Esercizi
Iniziare
Il primo programma
I commenti
Gli include
il Main
printf(): una funzione
Il secondo programma
Esercizi
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 keywordtypedef
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
Introduzione
Tipi di dato
funzioni standard
funzioni in Linux
Esercizi
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
il kernel 2.6.X
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
blacksheep & 2006-11-22