WRITE(2)

NOME
write - Scrive su un descrittore di file

SINTASSI
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

DESCRIZIONE
write() scrive fino a count byte contenuti in buf nel file a cui fa riferimento il descrittore di file fd. Il numero di byte scritti potrebbe essere meno di count se, per esempio, non c'è spazio sufficiente sul supporto fisico sottostante, o se si raggiunge il limite della risorsa RLIMIT_FSIZE (vedere setrlimit(2)), o se la chiamata è stata interrotta da un handler di segnale dopo che ha scritto meno di count byte (vedere anche pipe(7)). Per un file che si può spostare (cioè un file a cui si può applicare lseek(2), per esempio un file regolare), la scrittura viene eseguita all'offset del file attuale, e l'offset del file viene incrementato dal numero di byte effettivamente scritti. Se il file è stato aperto da open(2) con O_APPEND, l'offset del file viene prima impostato alla fine del file, e poi scritto. La regolazione dell'offset del file e l'operazione di scrittura vengono eseguite in modo minuzioso. POSIX richiede che una chiamata read(2) avvenuta dopo l'esecuzione di una chiamata write() restituisca i nuovi dati. Notare che non tutti i filesystem sono conformi a POSIX.

VALORI RESTITUITI
Se è andato tutto bene, la funzione restituisce il numero di byte scritti (zero indica che non è stato scritto nulla). In caso di errore viene restituito -1 , e errno viene impostato di conseguenza. Se count è zero, e fd fa riferimento ad un file regolare, write() può restituire uno stato di insuccesso se viene rilevato uno degli errori descritti più avanti. Se non vengono rilevati errori, restituisce 0 senza causare altri effetti. Se count è zero e fd fa riferimento ad un file diverso da uno regolare, i risultati non sono specificati.

ERRORI

EAGAIN
    Il descrittore di file fd fa riferimento a un file diverso da un socket ed è stato marcato come non bloccante (O_NONBLOCK), e la scrittura si bloccherebbe.

EAGAIN o EWOULDBLOCK
    Il descrittore di file fd fa riferimento a un diverso da un socket ed è stato marcato come non bloccante (O_NONBLOCK), e la scrittura si bloccherebbe. POSIX.1-2001 consente che venga restituito uno qualsiasi dei due errori per questo caso, e non richiede che queste costanti abbiano lo stesso valore, per cui un'applicazione portabile dovrebbe verificare entrambe le possibilità.

EBADF
    fd non è un decrittore di file valido o non è aperto in scrittura.

EDESTADDRREQ
    fd fa riferimento a un socket a datagrammi per il quale un indirizzo dello stesso livello non è stato impostato usando connect(2).

EDQUOT
    La quota utente di blocchi del disco sul filesystem contenente il file a cui fd fa riferimento è esaurita.

EFAULT
    buf è al di fuori del proprio spazio di indirizzamento accessibile.

EFBIG
    È stato fatto un tentativo di scrivere un file che supera la massima dimensione del file definita dall'implementazione o il limite di dimensione del file del processo, o di scrivere ad una posizione oltre il massimo offset consentito.

EINTR
    La chiamata è stata interrotta da un segnale prima che sia stato scritto qualunque dato; vedere signal(7).

EINVAL
    fd è attaccato a un oggetto su cui non si può scrivere; o il file è stato aperto con l'opzione O_DIRECT, e l'indirizzo specificato in buf, o il valore specificato in count, o l'offset del file corrente non è correttamente allineato.

EIO Un errore I/O di basso livello è accaduto mentre si modificava l'inode.

ENOSPC
    Il dispositivo contenente il file a cui fa riferimento fd non ha spazio per i dati.

EPIPE
    fd è connesso a una pipe o un socket la cui lettura è chiusa. Quando ciò accade il processo di scrittura riceverà anche un segnale SIGPIPE. (Quindi il valore restituito in scrittura è visto solo se il programma intercetta, blocca o ignora questo segnale).

Possono accadere altri errori, in funzione dell'oggetto connesso a fd.

CONFORME A
SVr4, 4.3BSD, POSIX.1-2001. Sotto SVr4 una scrittura può essere interrotta e restituire EINTR in qualsiasi punto, non solo prima che venga scritto un dato.

NOTE
Un ritorno con successo da write() non dà alcuna garanzia che i dati siano stati trasferiti sul disco. Infatti in alcune implementazioni errate, esso non garantisce che questo spazio sia stato riservato per i dati con successo. Il solo modo per essere sicuri è di chiamare fsync(2) dopo che si è eseguita la scrittura di tutti i propri dati. Se una scrittura con write() viene interrotta da un handler di segnale prima che venga scritto qualunque byte, la chiamata fallisce con l'errore EINTR; se viene interrotta dopo aver scritto almeno un byte, la chiamata ha successo e restituisce il numero di byte scritti.

VEDERE ANCHE
close(2), fcntl(2), fsync(2), ioctl(2), lseek(2), open(2), pwrite(2), read(2), select(2), writev(2), fwrite(3)

COLOPHON
Questa pagina fa parte del rilascio 3.64 del progetto Linux man-pages. Una descrizione del progetto, e le istruzioni per la segnalazione degli errori, si trova su http://www.kernel.org/doc/man-pages/. La versione italiana fa parte del pacchetto man-pages-it v. 3.64, a cura di: ILDP "Italian Linux Documentation Project" http://www.pluto.it/ildp
Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/
Segnalare eventuali errori di traduzione a ildp@pluto.it