Provided by: manpages-it_3.73-2_all bug

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

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

       La  versione  italiana  fa  parte  del  pacchetto  man-pages-it  v.  3.73, 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                                              2014-05-04                                           WRITE(2)