Sembolik Bağlar
Önceki XIV. Oylum - Dosya Sistemi Arayüzü Sonraki
Sembolik Bağlar
GNU sistemi sembolik bağları destekler. Bu aslında bir dosya ismine gösterici olan bir dosya çeşididir. Sabit bağların tersine, dizinlere ve diğer sosya sistemlerindeki dosyalara ve dizinlere sembolik bağlar yapılabilir. Ayrıca, olmayan bir dosyaya da bir sembolik bağ yapılabilir. Tersine sembolik bağın hedefindeki dosyanın silinmesi sembolik bağı sadece geçersiz hale getirir. Hedef dosya oluşturulana kadar bağ dosyası başarısız olarak kalır.
Sembolik bağların tercih edilmesinin bir başka sebebi de bağı açmaya çalıştığınızda bazı özel şeylerin yapılmasıdır. open işlevine dosya ismi olarak bir sembolik bağ ismi vererek bir bağı açmaya çalışırsanız, bağın içerdiği dosya ismini okur ve onun yerine bu dosyayı açar. stat işlevi ise tersine sembolik bağın kendisi ile değil, gösterdiği dosya ile çalışır.
Ayrıca, dosya silme ve isim değiştirme gibi bazı işlemler bağın kendisi üzerinde yapılır. readlink ve lstat işlevleri ayrıca sembolik bağları izlemekten kaçınır, çünkü onların amacı bağ hakkında bilgi sağlamaktır. Sabit bağ yapan link işlevi sembolik bağlara da sabit bağ yapar.
Bazı sistemlerde, dosyalarla çalışan bazı işlevlerin bir dosya yolu çözümlenirken kaç tane sembolik bağın izleneceğine ilişkin bir sınırlama vardır. Bu sınır sistemde eğer varsa sys/param.h başlık dosyasında tanımlıdır.
int MAXSYMLINKS
makro
MAXSYMLINKS makrosu bazı işlevlerin ELOOP değerini döndürmeden kaç tane sembolik bağ izleyebileceğini belirtir. Tüm işlevler böyle davranmaz ve bu değer sysconf işlevinin _SC_SYMLOOP için döndürdüğü değerle aynı değildir. Aslında, sysconf böyle bir sınır olmadığını belirten bir değer döndürür.
Bu bölümdeki işlevlerin çoğu unistd.h başlık dosyasında bildirilmiştir.
int symlink
(const char *eski-isim,
 const char *yeni-isim)
işlev
symlink işlevi eski-isim isimli dosyaya yeni-isim isimli bir sembolik bağ yapar.
İş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:
EEXIST
yeni-isim isminde bir dosya zaten var.
EROFS
Yeni bağı içerecek dizine dosya sistemi salt-okunur bağlı olduğundan yazılamıyor.
ENOSPC
Yeni bağı içerecek dizin ya da dosya sisteminde yer yok ve genişletilemiyor.
EIO
Diske okuma ya da yazma denemesi sırasında bir donanım hatası oluştu.
int readlink
(const char *dosyaismi,
 char       *tampon,
 size_t      boyut)
işlev
readlink işlevi sembolik bağın ismini dosyaismi ile alır ve sembolik bağın hedefindeki dosyanın ismini *tampon'a yerleştirir. Dosya ismi dizgesi boş karakter sonlandırmalı değildir; işlev tampon ile gösterilen dizgeye yerleştirilen karakterlerin sayısı ile döner, dolayısıyla boyut argümanı en azından bu değerde olmalıdır.
Eğer işlev boyut değerine eşit bir değerle dönmüşse, dosya ismi için yeterli yerin olup olmadığı hakkında bir fikir vermez. Bu durumda tamponu büyütüp tekrar denemelisiniz. Bir örnek:
char *
readlink_malloc (const char *filename)
{
  int size = 100;
  char *buffer = NULL;

  while (1)
    {
      buffer = (char *) xrealloc (buffer, size);
      int nchars = readlink (filename, buffer, size);
      if (nchars < 0)
        {
          free (buffer);
          return NULL;
        }
      if (nchars < size)
        return buffer;
      size *= 2;
    }
}
İşlevin dönüş değeri -1 ise bir hata oluşmuş demektir.Dosya ismi hatalarına ek olarak aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EINVAL
İsmi belirtilen dosya bir sembolik bağ değil.
EIO
Diske okuma ya da yazma denemesi sırasında bir donanım hatası oluştu.
Bazı durumlarda sembolik bağların hedefindeki gerçek dosya isminin başka hiçbir sembolik bağ, önek ve dosya yolunda . veya .. olmaksızın çözümlenmesi istenebilir. Bu isteğe bir örnek, aynı dosya düğümüne erişen farklı dosya isimlerinin karşılaştırılmasıdır.
char *canonicalize_file_name
(const char *isim)
işlev
canonicalize_file_name işlevi isim ile belirtilen dosya isminin ne ., .. elemanları ne herhangi bir dosya yolu ayracı (/) ne de sembolik bağ içeren mutlak ismini döndürür. İşlev dönüş değerini malloc ile ayrılmış bellek bloğunda döndürür. Eğer dönen sonuç artık kullanılmayacaksa free çağrısı ile serbest bırakılmalıdır.
Bir dosya yolu elemanı yoksa işlev bir boş gösterici ile döner. Bu ayrıca, dosya yolunun uzunluğu PATH_MAX karakteri aşarsa da döndürülür. Her durumda errno değişkenine hata durumu atanır.
ENAMETOOLONG
Sonuçlanan dosya yolu çok uzun. Bu hata dosya isimlerinde uzunluk sınırı olan dosya sistemlerinde oluşur.
EACCES
Dosya yolunu oluşturan elemanlardan en az biri okunamıyor.
ENOENT
Girdi dosya ismi boş.
ENOENT
Dosya yolunu oluşturan elemanlardan en az biri mevcut değil.
ELOOP
MAXSYMLINKS'den fazla sembolik bağ izlendi.
Bu işlev bir GNU oluşumudur ve stdlib.h başlık dosyasında bildirilmiştir.
Unix standardı canonicalize_file_name işlevinin bir benzeri olarak sonucun yerleştirileceği tamponu kullanıcının belirteceği bir işlev tanımlamıştır.
char *realpath
(const char *restrict isim,
 char *restrict       sonuç)
işlev
realpath işlevi sonuç parametresinde boş gösterici belirtildiğinde tamamen canonicalize_file_name gibi davranır. İşlev bir tampon ayırır ve ona bir gösterici ile döner. Eğer sonuç NULL değilse, sonuç onun gösterdiği tampona kopyalanır. Çağrıcıya yanıtı yeterince büyük bir tampon ayırmaktır. PATH_MAX'ın tanımlı olduğu sistemlerde tampon bu uzunlukta olmalıdır. Dosya yolu uzunluğu için bir sınırlama bulunmayan sistemlerde uzunluk tahmin edilemeyeceğinden realpath işlevi ikinci parameresinde NULL dışında bir değer belirterek çağrılmamalıdır.
Bir diğer fark da, işlev NULL ile döndüğünde sonuç tamponunun (sıfırdan farklıysa) mevcut olmayan ya da okunamayan dosya yolu parçaları içereceğidir. Bu durumda errno değişkenine EACCES ya da ENOENT atanır.
Bu işlev stdlib.h dosyasında bildirilmiştir.
Bu işlevi kullanmanın bir faydası da geniş çapta kullanım alanı olmasıdır. Sakıncası ise uzun dosya isimleri için sınırlama olmayan sistemlerde uzun dosya yolu başarısızlıkları raporlamasıdır.
Önceki Üst Ana Başlık Sonraki
Sabit Bağlar Başlangıç Dosyaların Silinmesi
Bir Linux Kitaplığı Sayfası