Dosya Boyu
Önceki Dosya Öznitelikleri Sonraki
Dosya Boyu
Normalde dosya boyu özdevinimli olarak belirlenir. Bir dosya 0 boyda başlar ve veri yazıldıkça özdevinimli olarak uzar. Ayrıca, bir open ya da fopen çağrısı ile bir dosyanın içeriğini silmek ve boş duruma getirmek mümkündür.
Yine de, kimi zaman bir dosyanın boyunu küçültmek gerekebilir. Bu işlem truncate ve ftruncate işlevleri ile yapılır. Bunlar BSD Unix'den gelir. ftruncate işlevi daha sonra POSIX.1'e eklenmiştir.
Bazı sistemler bu işlevlerle bir dosyayı uzatmaya da (delikler oluşturarak) izin verir. Dosyalar özdevinimli uzatılamadığında bellek eşlemli G/Ç kullanılırken yararlı olur. Ancak, bu taşınabilir olmadığından, dosyaların eşlenmesine izin veriyorsa mmap ile gerçeklenmelidir (_POSIX_MAPPED_FILES tanımlıysa izin verir).
Bu işlevlerin normal dosyalar dışında kullanılması tanımlanmamış sonuçlara yol açabilir. Çoğu sistemde böyle bir çağrı, aslında hiçbir işlem yapmakszın başarılı görünecektir.
int truncate
(const char *dosyaismi,
 off_t       uzunluk)
işlev
truncate işlevi ismi dosyaismi ile belirtilen dosyanın uzunluğunu uzunluk yapar. Eğer uzunluk önceki uzunluktan küçükse dosyanın sonundaki veri kaybedilecektir. Bu işlemin gerçekleşebilmesi için kullanıcının dosyaya yazma izni olmalıdır.
Eğer uzunluk önceki uzunluktan daha büyükse dosyanın sonuna delikler eklenir. Ancak, bazı sistemler bu işlemi desteklemez ve dosya değişmeden kalır.
Kaynakların 32 bitlik bir sistemde _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev aslında truncate64 işlevidir ve off_t türü 2^63 bayt uzunluğa kadar dosyaları mümkün kılan 64 bitlik bir türdür.
İşlev başarılı olduğunda 0, aksi takdirde -1 ile döner. Dosya ismi hatalarına ek olarak aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EACCES
Dosya ya bir dizin ya da yazılabilir değil.
EINVAL
uzunluk negatif.
EFBIG
Dosya boyu, işletim sisteminin sınırlarından fazlasına genişletiliyor.
EIO
Bir donamım G/Ç hatası oluştu.
EPERM
Dosya ya sona eklemeli ya da değiştirilemez türde.
EINTR
İşlem bir sinyal ile engellendi.
int truncate64
(const char *isim,
 off64_t     uzunluk)
işlev
Bu işlev truncate işlevinin benzeridir. Farkı, uzunluk argümanının 32 bitlik makinelerde bile 64 bitlik genişlikte olmasıdır. Böylece 2^63 bayta kadar dosya uzunlukları belirtilebilir.
32 bitlik bir sistemde, kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev truncate ismiyle bulunur ve eski gerçekleme tamamen LFS'ye uygun olarak değiştirilir.
int ftruncate
(int   dosyatanıtıcı,
 off_t uzunluk)
işlev
Bu işlev truncate gibidir, ancak bir açık dosya tanıtıcı ile çalışır. Dosya yazma amacıyla açılmış olmalıdır.
POSIX standardı, dosyanın yeni uzunluk değerinin özgün dosya boyundan daha büyük olduğu durumda ne yapılacağını gerçeklemeye bırakmıştır. ftruncate işlevi ya dosyayı hiçbir şey yapmadan bırakır ya da istenen boya arttırır. İkinci durumda uzatılan bölge sıfırlarla doldurulur. ftruncate işlevi ile dosya boyunun arttırılması pek güvenilir olmasa da eğer uzatilabiliyorsa bu olası en hızlı yöntemdir. Bu işlev ayrıca eğer sistem tarafından gerçeklenmişse POSIX paylaşımlı bellek bölütleri üzerinde de çalışır.
ftruncate işlevi özellikle mmap ile birlikte kullanıldığında yararlıdır. Dosya ile eşlenen bellek bölgeleri sabit uzunlukta olduğundan son eşlenen sayfaya daha fazla bilgi yazarak dosya boyu büyütülemez. Dosya boyunu büyütmek için dosya yeni boyutla yeniden belleğe eşlenmelidir. Bunun nasıl yapıldığı aşağıda bir örnekle gösterilmiştir.
Kaynakların 32 bitlik bir sistemde _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev aslında ftruncate64 işlevidir ve off_t türü 2^63 bayt uzunluğa kadar dosyaları mümkün kılan 64 bitlik bir türdür.
İşlev başarılı olduğunda 0, aksi takdirde -1 ile döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EBADF
dosyatanıtıcı bir açık dosya ile ilgili değil.
EACCES
dosyatanıtıcı ya bir dizin ya da yazmak için açılmamış.
EINVAL
uzunluk negatif.
EFBIG
Dosya boyu, işletim sisteminin sınırlarından fazlasına genişletiliyor.
EIO
Bir donamım G/Ç hatası oluştu.
EPERM
Dosya ya sona eklemeli ya da değiştirilemez türde.
EINTR
İşlem bir sinyal ile engellendi.
int ftruncate64
(int     id,
 off64_t uzunluk)
işlev
Bu işlev ftruncate işlevinin benzeridir. Farkı, uzunluk argümanının 32 bitlik makinelerde bile 64 bitlik genişlikte olmasıdır. Böylece 2^63 bayta kadar dosya uzunlukları belirtilebilir.
32 bitlik bir sistemde, kaynakların _FILE_OFFSET_BITS == 64 ile derlendiği durumda bu işlev ftruncate ismiyle bulunur ve eski gerçekleme tamamen LFS'ye uygun olarak değiştirilir.
Yukarıda bahsedildiği gibi burada ftruncate işlevinin mmap ile birlikte kullanılışına küçük bir örnek vardır::
int fd;
void *start;
size_t len;

int
add (off_t at, void *block, size_t size)
{
  if (at + size > len)
    {
      /* Dosyanın boyunu değiştir ve belleğe eşle.  */
      size_t ps = sysconf (_SC_PAGESIZE);
      size_t ns = (at + size + ps - 1) & ~(ps - 1);
      void *np;
      if (ftruncate (fd, ns) < 0)
        return -1;
      np = mmap (NULL, ns, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
      if (np == MAP_FAILED)
        return -1;
      start = np;
      len = ns;
    }
  memcpy ((char *) start + at, block, size);
  return 0;
}
add işlevi dosyada keyfi bir konuma bir bellek bloğunu yazar. Eğer dosyanın mevcut uzunluğu yetersizse dosya uzatılır. Uzatmanın sayfa sayısına yuvarlandığına dikkat edin. Bu mmap'in bir gereksinimidir. Yazılım gerçek boyutu daima izler ve işlem bittiğinde son bir ftruncate çağrısıyla dosyanın gerçek boyunu belirler.
Önceki Üst Ana Başlık Sonraki
Dosya Zamanları Başlangıç Özel Dosyaların Oluşturulması
Bir Linux Kitaplığı Sayfası