bionic (2) write.2.gz

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