write işlevi dosyatanıtıcı tanıtıcılı dosyaya
tampon tamponundaki boyut baytı yazar. tampon içindeki veri bir karakter dizgesi olması gerekmediği gibi bir boş karakter de sıradan bir karakter olarak ele alınır.
İşlevin normal dönüş değeri yazılabilen baytların sayısıdır. Bu boyut sayıda olabileceği halde hep daha küçük olur. Yazılımınızda işlevi, tüm veriyi yazana kadar tekrarlanan write çağrıları şeklinde bir döngü içinde kullanmalısınız.
write döndükten hemen sonra kuyruklanan veri okunabilir. Bunun için verinin kalıcı bir saklama alanına yazılması şart değildir. Devam etmeden önce verinin kalıcı saklama alanına yazılmasını sağlamak için
fsync kullanablirsiniz. (Yazma işlemini peşpeşe çağrılar şeklinde bir defada gerçekleştirip saklama alanına yazma işini sisteme bırakmak daha verimlidir. Normalde bu veri diske bir dakikadan daha geç yazılmaz.) Günümüz sistemlerinde
fdatasync adında bir işlev daha vardır ve bununla dosya verisinin bütünlüğü garanti edilmiştir ve daha hızlıdır. Dosyayı
O_FSYNC kipinde açarsanız
write çağrıları veri diske yazılmadan dönmeyecektir; bkz.
G/Ç İşlem Kipleri.
Hata durumunda işlev -1 ile döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
- EAGAIN
Normalde, yazma işlemi tamamlanana kadar
write dönmez. Fakat
O_NONBLOCK seçeneği etkinse (bkz.
Dosyalar Üzerindeki Denetim İşlemleri), hiçbir veri yazılmadan işlev hemen bu hata durumu ile döner. Bu duruma bir örnek vermek gerekirse, sürecin bir STOP karakteri aldığında, akış denetimini destekleyen bir uçbirim aygıtına çıktının yazılmasını engellemesi verilebilir.
| Uyumluluk Bilgisi |
---|
BSD Unix'in çoğu sürümü bu hata kodu için farklı bir hata kodu kullanır: EWOULDBLOCK. GNU kütüphanesinde EWOULDBLOCK, EAGAIN için bir takma addır, dolayısıyla hangi ismin kullanıldığının bir önemi yoktur. |
Bazı sistemlerde, çekirdek kullanıcı sayfaları için yeterli fiziksel bellek bulamazsa, bir karakter özel dosyasına büyük miktarda veri yazılması da EAGAIN hata koduna sebep olur. Bu, kullanıcı belleğine doğrudan bellek erişimi ile iletim yapan aygıtlarla sınırlıdır. Bunlar uçbirimleri kapsamaz, çünkü uçbirimler için çekirdek içinde daima ayrı tamponlar vardır. GNU kütüphanesinde böyle bir sorunla asla karşılaşmayacaksınız.
- EBADF
dosyatanıtıcı argümanı geçerli bir dosya tanıtıcı değil ya da yazma amacıyla açılmamış
- EFBIG
Dosya boyutu gerçeklemenin desteklediğinden büyük
- EINTR
write işlemi tamamlanmadan önce bir sinyal tarafından durduruldu. Bir sinyal her zaman
write işlevinin
EINTR döndürmesine sebep olmaz; istenenden daha az baytı yazarak da işlev başarılı olabilir. Bkz.
Sinyallerle Kesilen İlkeller.
- EIO
Çoğu aygıt ve disk dosyası için bu hata kodu bir donanım hatasını işaret eder.
- ENOSPC
Aygıtın dosyası dolu.
- EPIPE
Bu hata bir süreç tarafından okumak için açılmamış bir boru ya da FIFO'ya yazmaya çalışırsanız oluşur. Bu oluştuğu zaman sürece bir
SIGPIPE sinyali gönderilir; bkz.
Sinyal İşleme.
- EINVAL
Bazı sistemlerde bir karakter veya blok aygıtından okuma yapılırken, konum ve boyut başlangıçları belli bir blok boyuna hizalanmalıdır. Bu hata başlangıçların gerektiği gibi hizalanmadığını belirtir.
EINTR başarısızlıklarından korunmak için bir düzenleme yapmadıkça, her başarısız
write çağrısından sonra
errno değişkenine bakmalı ve bu
EINTR hatası ise çağrıyı tekrarlamalısınız. Bkz.
Sinyallerle Kesilen İlkeller. Bunu yapmanın kolay bir yolu
TEMP_FAILURE_RETRY makrosunu kullanmaktır:
nbytes = TEMP_FAILURE_RETRY (write (desc, buffer, count));
write64 isminde bir işlevin olmadığını unutmayın. İşlev olası geniş dosya konumlarını işlemek ya da değiştirmek için bir işlem yapmadığından bu gerekli değidir. Çekirdek gerekeni kendi içinde hallettiğinden write işlevi her durumda kullanılabilir.
Bu işlev çok evreli yazılımlarda bir iptal noktasıdır. write çağrısı sırasında evre bazı özkaynakları (bellek, dosya tanıtıcı, semafor, vb.) ayırdığında bu bir sorun olur. Evre tam bu anda bir iptal alırsa ayrılan özkaynaklar yazılım sonlanana kadar ayrılmış olarak kalır. Bu tür write çağrılarından kaçınmak için iptal eylemcileri kullanılarak korunulmalıdır.
write işlevi, akımlardan okuma yapan fputc gibi işlevlerin düşük seviyedeki karşılığıdır.