write

WRITE(2)                   Linux Programmer's Manual                  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, 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 come un'operazione atomica.

       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).  Non è un errore
       se questo numero è minore del numero di byte richiesti; questo può
       succedere per esempio perché il disco era pieno.  Vedi anche NOTE.  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, o se non la
       rilevazione degli errori non è eseguita, 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.  Vedi open(2) per ulteriori dettagli
              sull'opzione O_NONBLOCK.

       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 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.

       EPERM  L'operazione è stata impedita da una restrizione sul file; vedi
              fcntl(2).

       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
       I tipi size_t e sono tipi di dati interi specificati da POSIX.1,
       rispettivamente senza segno e con segno

       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 in modo corretto.  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.

       Su Linux, write() (e chiamate d sistema simili) trasferiranno al
       massimo 0x7ffff000 (2,147,479,552) byte, restituendo il numero di byte
       effettivamente trasferiti.

       (Questo è vero sia sui sistemi a 32 bit sia su quelli a 64 bit)

BUG
       Secondo POSIX.1-2008/SUSv4 Section XSI 2.9.7 ("Thread Interactions with
       Regular File Operations"):

           Tutte le seguenti funzioni devono essere atomiche l'una rispetto
           all'altra nei risultati specificati in POSIX.1-2008 quando esse
           operano su file regolari o su collegamenti simbolici: ...

       Tra le API elencate susseguentemente ci sono write() e writev(2).  E
       tra i risultati che dovrebbero essere atomici attraverso i thread (e i
       processi) ci sono gli aggiornamenti dell'offset dei file.  Tuttavia,
       sulle versioni di Linux precedenti alla 3.14 non era così: se due
       processi che condividono una descrizione di file aperto (vedi open(2))
       effettuano un write() (o writev(2)) allo stesso tempo, le operazioni
       I/O non erano atomiche rispetto all'offset del file, col risultato che
       i blocchi di dati in uscita dai due processi potrebbero (non
       correttamente) sovrapporsi.  Questo problema è stato risolto in Linux
       3.14.

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 4.08 del progetto Linux man-pages.
       Una descrizione del progetto, le istruzioni per la segnalazione degli
       errori, e l'ultima versione di questa pagina si trovano su
       https://www.kernel.org/doc/man-pages/.

       La versione italiana fa parte del pacchetto man-pages-it v. 4.08, 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



Linux                             2016-03-15                          WRITE(2)