Dosya Durum Seçeneklerinin Saptanması
Önceki Dosya Durum Seçenekleri Sonraki
Dosya Durum Seçeneklerinin Saptanması
Dosya durum seçeneklerini öğrenmek ve belirlemek için fcntl işlevi kullanılır.
int F_GETFL
makro
Bu makro fcntl işlevinin komut argümanında kullanıldığında dosyatanıtıcı ile ilgili açık dosyanın dosya durum seçeneklerini okur.
Bu komutun fcntl işlevinden döndürdüğü değer normalde tek tek seçeneklerin bit seviyesinde VEYA'lanmasıyla elde edilen negatif olmayan bir değerdir. Dosya erişim kipleri GNU sistemi dışında eşsiz bit değerler olmadıklarından bu bitlere bu makro ile değil, O_ACCMODE makrosu ile erişebilirsiniz.
Bir hata durumunda fcntl -1 ile döner. Aşağıdaki errno hata durumu bu komut için tanımlanmıştır:
EBADF
dosyatanıtıcı argümanı geçersiz.
int F_SETFL
makro
Bu makro fcntl işlevinin komut argümanında kullanılarak dosyatanıtıcı ile ilgili açık dosyanın dosya durum seçenekleri belirlenebilir. Bu komut, yeni seçeneklerin belirtildiği üçüncü bir argümanın varlığını gerektirir:
fcntl (dosyatanıtıcı, F_SETFL, yeni_seçenekler)
Bir dosya tanıtıcının erişim kipini bu komutla değiştiremezsiniz.
Bu komutun fcntl işlevinden döndürdüğü değer hata durumunu belirten -1 değeri dışında belirsizdir. Hata durumları F_GETFL komutu ile aynıdır.
Dosya durum seçeneklerini değiştirmek isterseniz önce o anki seçenekleri F_GETFL ile almalı sonra bu değeri değiştirmelisiniz. Sadece burada açıklanan seçeneklerin varolduğu gibi bir kabul yapmamalısınız; yazılımınız yıllar sonra daha fazla seçeneğin varolduğu bir sistem üzerinde de çalışabilmelidir. Örneğin, aşağıdaki işlev diğer seçeneklere dokunmadan sadece O_NONBLOCK seçeneğini değiştirir:
/* desc tanıtıcısına O_NONBLOCK seçeneği,
  value sıfırdan farklıysa atanır, değilse temizlenir.
  Dönüş değeri hata yoksa 0, varsa -1 olur ve hata errno'ya
  atanır. */

int
set_nonblock_flag (int desc, int value)
{
  int oldflags = fcntl (desc, F_GETFL, 0);
  /* seçeneklerin okunması başarısız olursa,
     hata durmunun belirtip hemen dönelim. */
  if (oldflags == -1)
    return -1;
  /* Seçeneğin durumunu belirleyebiliriz. */
  if (value != 0)
    oldflags |= O_NONBLOCK;
  else
    oldflags &= ~O_NONBLOCK;
  /* Değiştirilen seçeneği dosya tanıtıcısına atayalım. */
  return fcntl (desc, F_SETFL, oldflags);
}
Önceki Üst Ana Başlık Sonraki
G/Ç İşlem Kipleri Başlangıç Dosya Kilitleri
Bir Linux Kitaplığı Sayfası