write(2) System Calls Manual write(2) NOME write - Scrive su un descrittore di file LIBRARY Standard C library (libc, -lc) SINTASSI #include ssize_t write(int fd, const void buf[.count], size_t count); DESCRIZIONE write() scrive fino a count byte dal buffer che inizia da 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'e spazio sufficiente sul supporto fisico sottostante, o se si raggiunge il limite della risorsa RLIMIT_FSIZE (vedere setrlimit(2)), o se la chiamata e stata interrotta da un handler di segnale dopo che ha scritto meno di count byte (vedere anche pipe(7)). Per un file che si puo spostare (cioe un file a cui si puo 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 e 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. Secondo POSIX.1, se count e maggiore di SSIZE_MAX, il risultato e definito dall'implementazione; vedi NOTE per il limite superiore in Linux. VALORE RESTITUITO Se e andato tutto bene, la funzione restituisce il numero di byte scritti. In caso di errore viene restituito -1, e errno viene impostato per indicare l'errore. Si noti che una chiamata write() andata a buon fine puo trasferire meno di count byte. Tali scritture parziali possono avvenire per diverse ragioni; per esempio, perche lo spazio sul dispositivo del disco era insufficiente per scrivere tutti i byte richiesti, o perche una chiamata write() bloccata su un socket, una pipe, o simili e stata interrotta da un gestore di segnale dopo che aveva trasferito alcuni byte, ma prima di aver trasferito tutti quelli richiesti. Nel caso di un write parziale, il chiamante puo fare un'altra chiamata a write() per trasferire i byte rimanenti. La chiamata successiva o trasferisce ulteriori byte o puo determinare un errore (e.g., se il disco ora e pieno). Se count e zero, e fd fa riferimento ad un file regolare, write() puo restituire uno stato di insuccesso se viene rilevato uno degli errori descritti piu avanti. Se non vengono rilevati errori, o se non la rilevazione degli errori non e eseguita, restituisce 0 senza causare altri effetti. Se count e 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 e 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 e 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 possibilita. EBADF fd non e un decrittore di file valido o non e aperto in scrittura. EDESTADDRREQ fd fa riferimento a un socket a datagrammi per il quale un indirizzo dello stesso livello non e stato impostato usando connect(2). EDQUOT La quota utente di blocchi del disco sul filesystem contenente il file a cui fd fa riferimento e esaurita. EFAULT I bufe al di fuori del proprio spazio di indirizzamento accessibile. EFBIG E 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 e stata interrotta da un segnale prima che sia stato scritto qualunque dato; vedere signal(7). EINVAL fd e attaccato a un oggetto su cui non si puo scrivere; o il file e 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 e correttamente allineato. EIO EIO Un errore I/O di basso livello e accaduto mentre si modificava l'inode. Quest'errore puo riguardare il "write-back" di dati scritti da un precedente write(), che puo essere stato eseguito usando un altro descrittore di file che serviva per accedere allo stesso file. A partire da Linux 4.13, gli errori derivanti da write-back si presentano con la speranza che possano essere riportati da successive richieste di write(), e verranno riportati da un successivo fsync(2) (che siano stati riportati o no anche da write()). Un'altra causa di EIO su filesystem collegati in rete e quando un lock consigliato (advisory lock) era gia stato scaricato sul descrittore di file e questo lock e stato perso. Si veda la sezione Lost locks di fcntl(2) per ulteriori dettagli. ENOSPC Il dispositivo contenente il file a cui fa riferimento fd non ha spazio per i dati. EPERM L'operazione e stata impedita da una restrizione sul file; vedi fcntl(2). EPIPE fd e connesso a una pipe o un socket la cui lettura e chiusa. Quando cio accade il processo di scrittura ricevera anche un segnale SIGPIPE. (Quindi il valore restituito in scrittura e visto solo se il programma intercetta, blocca o ignora questo segnale). Possono accadere altri errori, in funzione dell'oggetto connesso a fd. STANDARDS POSIX.1-2008. STORIA SVr4, 4.3BSD, POSIX.1-2001. Sotto SVr4 una scrittura puo essere interrotta e restituire EINTR in qualsiasi punto, non solo prima che venga scritto un dato. NOTE Un ritorno con successo da write() non da alcuna garanzia che i dati siano stati trasferiti sul disco. Su alcuni filesystem, compreso NFS, esso non garantisce che questo spazio sia stato riservato per i dati in modo corretto. In questo caso, alcuni errori potrebbero essere differiti fino a un futuro write(), fsync(2), o anche close(2). Il solo modo per essere sicuri e di chiamare fsync(2) dopo che si e 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 di sistema simili) trasferiranno al massimo 0x7ffff000 (2,147,479,552) byte, restituendo il numero di byte effettivamente trasferiti. (Questo e vero sia sui sistemi a 32 bit sia su quelli a 64 bit) Un valore di errore restituito mentre si esegue una chiamata write() usando I/O diretto non significa che l'intera scrittura non abbia avuto successo. Possono venir scritti dati parziali e i dati all'offset del file sul quale e stata tentata la chiamata write() dovrebbe essere considerata incongruente. 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: ... Among the APIs subsequently listed are write() and writev(2). And among the effects that should be atomic across threads (and processes) are updates of the file offset. However, before Linux 3.14, this was not the case: if two processes that share an open file description (see open(2)) perform a write() (or writev(2)) at the same time, then the I/O operations were not atomic with respect to updating the file offset, with the result that the blocks of data output by the two processes might (incorrectly) overlap. This problem was fixed 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) TRADUZIONE La traduzione italiana di questa pagina di manuale e stata creata da Goffredo Baroncelli , Giulio Daprela , Elisabetta Galli e Marco Curreli Questa traduzione e documentazione libera; leggere la GNU General Public License Versione 3 o successiva per le condizioni di copyright. Non ci assumiamo alcuna responsabilita. Per segnalare errori nella traduzione di questa pagina di manuale inviare un messaggio a . Linux man-pages 6.06 31 ottobre 2023 write(2)