X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=filestd.tex;h=2c232802e0360c010635a2799f49a00eb0bb2f49;hp=0bb202fcf9fea252325bbd68371d585d26e2d613;hb=b81723c64c1d63b89cd3cec12f2fcccc4a756967;hpb=60e20d29c0515f95b8a171fb33c7214c9bf92021 diff --git a/filestd.tex b/filestd.tex index 0bb202f..2c23280 100644 --- a/filestd.tex +++ b/filestd.tex @@ -1,6 +1,6 @@ %% filestd.tex %% -%% Copyright (C) 2000-2007 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2010 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", @@ -332,8 +332,8 @@ I nuovi file saranno creati secondo quanto visto in sez.~\ref{sec:file_ownership_management} ed avranno i permessi di accesso impostati al valore \code{S\_IRUSR|S\_IWUSR|S\_IRGRP|S\_IWGRP|S\_IROTH|S\_IWOTH} (pari a -\val{0666}) modificato secondo il valore di \acr{umask} per il processo (si -veda sez.~\ref{sec:file_perm_management}). +\val{0666}) modificato secondo il valore di \itindex{umask} \textit{umask} per +il processo (si veda sez.~\ref{sec:file_perm_management}). In caso di file aperti in lettura e scrittura occorre ricordarsi che c'è di mezzo una bufferizzazione; per questo motivo lo standard ANSI C @@ -541,8 +541,8 @@ eventuali differenze. Le \acr{glibc} definiscono altre due funzioni per l'I/O binario, \funcd{fread\_unlocked} e \funcd{fwrite\_unlocked} che evitano il lock implicito dello stream, usato per dalla librerie per la gestione delle -applicazioni multi-thread (si veda sez.~\ref{sec:file_stream_thread} per i -dettagli), i loro prototipi sono: +applicazioni \itindex{thread} \textit{multi-thread} (si veda +sez.~\ref{sec:file_stream_thread} per i dettagli), i loro prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -615,7 +615,7 @@ carattere in formato esteso (cio \param{stream}. In genere è implementata come una macro. \funcdecl{wint\_t fgetwc(FILE *stream)} Legge un carattere esteso da - \param{stream} È una sempre una funzione. + \param{stream}. È una sempre una funzione. \funcdecl{wint\_t getwchar(void)} Equivalente a \code{getwc(stdin)}. @@ -632,10 +632,10 @@ loro prototipi sono: \funcdecl{int putc(int c, FILE *stream)} Scrive il carattere \param{c} su \param{stream}. In genere è implementata come una macro. - \funcdecl{int fputc(FILE *stream)} Scrive il carattere \param{c} su + \funcdecl{int fputc(int c, FILE *stream)} Scrive il carattere \param{c} su \param{stream}. È una sempre una funzione. - \funcdecl{int putchar(void)} Equivalente a \code{putc(stdin)}. + \funcdecl{int putchar(int c)} Equivalente a \code{putc(stdout)}. \bodydesc{Le funzioni scrivono sempre un carattere alla volta, il cui valore viene restituito in caso di successo; in caso di errore o @@ -1306,7 +1306,10 @@ pu In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni \func{fseeko} e \func{ftello}, che sono assolutamente identiche alle precedenti \func{fseek} e \func{ftell} ma hanno argomenti di tipo -\type{off\_t} anziché di tipo \ctyp{long int}. +\type{off\_t} anziché di tipo \ctyp{long int}. Dato che \ctyp{long} è nella +gran parte dei casi un intero a 32 bit, questo diventa un problema quando la +posizione sul file viene espressa con un valore a 64 bit come accade nei +sistemi più moderni. @@ -1316,7 +1319,7 @@ precedenti \func{fseek} e \func{ftell} ma hanno argomenti di tipo In questa sezione esamineremo alcune funzioni avanzate che permettono di eseguire operazioni particolari sugli stream, come leggerne gli attributi, controllarne le modalità di bufferizzazione, gestire direttamente i lock -impliciti per la programmazione multi thread. +impliciti per la programmazione \itindex{thread} \textit{multi-thread}. \subsection{Le funzioni di controllo} @@ -1537,29 +1540,32 @@ scrittura), e tutto l'input non ancora letto (se compresi gli eventuali caratteri rimandati indietro con \func{ungetc}. -\subsection{Gli stream e i thread} +\subsection{Gli \textit{stream} e i \textit{thread}} \label{sec:file_stream_thread} -Gli stream possono essere usati in applicazioni multi-thread allo stesso -modo in cui sono usati nelle applicazioni normali, ma si deve essere +\itindbeg{thread} + +Gli stream possono essere usati in applicazioni \textit{multi-thread} allo +stesso modo in cui sono usati nelle applicazioni normali, ma si deve essere consapevoli delle possibili complicazioni anche quando non si usano i -thread, dato che l'implementazione delle librerie è influenzata -pesantemente dalle richieste necessarie per garantirne l'uso con i thread. +\textit{thread}, dato che l'implementazione delle librerie è influenzata +pesantemente dalle richieste necessarie per garantirne l'uso con i +\textit{thread}. Lo standard POSIX richiede che le operazioni sui file siano atomiche rispetto -ai thread, per questo le operazioni sui buffer effettuate dalle funzioni di -libreria durante la lettura e la scrittura di uno stream devono essere -opportunamente protette (in quanto il sistema assicura l'atomicità solo per le -system call). Questo viene fatto associando ad ogni stream un opportuno blocco -che deve essere implicitamente acquisito prima dell'esecuzione di qualunque -operazione. - -Ci sono comunque situazioni in cui questo non basta, come quando un thread -necessita di compiere più di una operazione sullo stream atomicamente, per -questo motivo le librerie provvedono anche delle funzioni \funcd{flockfile}, -\funcd{ftrylockfile} e \funcd{funlockfile}, che permettono la gestione -esplicita dei blocchi sugli stream; esse sono disponibili definendo -\macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: +ai \textit{thread}, per questo le operazioni sui buffer effettuate dalle +funzioni di libreria durante la lettura e la scrittura di uno stream devono +essere opportunamente protette (in quanto il sistema assicura l'atomicità solo +per le system call). Questo viene fatto associando ad ogni stream un opportuno +blocco che deve essere implicitamente acquisito prima dell'esecuzione di +qualunque operazione. + +Ci sono comunque situazioni in cui questo non basta, come quando un +\textit{thread} necessita di compiere più di una operazione sullo stream +atomicamente, per questo motivo le librerie provvedono anche delle funzioni +\funcd{flockfile}, \funcd{ftrylockfile} e \funcd{funlockfile}, che permettono +la gestione esplicita dei blocchi sugli stream; esse sono disponibili +definendo \macro{\_POSIX\_THREAD\_SAFE\_FUNCTIONS} ed i loro prototipi sono: \begin{functions} \headdecl{stdio.h} @@ -1578,8 +1584,8 @@ eseguire tutte le operazioni volute, per poi rilasciarlo. Ma, vista la complessità delle strutture di dati coinvolte, le operazioni di blocco non sono del tutto indolori, e quando il locking dello stream non è -necessario (come in tutti i programmi che non usano i thread), tutta la -procedura può comportare dei costi pesanti in termini di prestazioni. Per +necessario (come in tutti i programmi che non usano i \textit{thread}), tutta +la procedura può comportare dei costi pesanti in termini di prestazioni. Per questo motivo abbiamo visto come alle usuali funzioni di I/O non formattato siano associate delle versioni \code{\_unlocked} (alcune previste dallo stesso standard POSIX, altre aggiunte come estensioni dalle \acr{glibc}) che possono @@ -1590,8 +1596,8 @@ con prestazioni molto pi accade per \func{getc} e \func{putc}) sono realizzate come macro. La sostituzione di tutte le funzioni di I/O con le relative versioni -\code{\_unlocked} in un programma che non usa i thread è però un lavoro -abbastanza noioso; per questo motivo le \acr{glibc} forniscono al +\code{\_unlocked} in un programma che non usa i \textit{thread} è però un +lavoro abbastanza noioso; per questo motivo le \acr{glibc} forniscono al programmatore pigro un'altra via\footnote{anche questa mutuata da estensioni introdotte in Solaris.} da poter utilizzare per disabilitare in blocco il locking degli stream: l'uso della funzione \funcd{\_\_fsetlocking}, il cui @@ -1617,6 +1623,9 @@ che pu di blocco dello stream. \end{basedescript} +\itindend{thread} + + %%% Local Variables: %%% mode: latex