Dosyaların Açılması ve Kapatılması
Önceki XIII. Oylum - Düşük Seviyeli Girdi ve Çıktı Sonraki
Dosyaların Açılması ve Kapatılması
Bu kısımda dosya tanıtıcılar kullanılarak dosyaların açılması ve kapatılması için kullanılan ilkeller açıklanacaktır. open ve creat işlevleri fcntl.h dosyasında bildirilmişken close işlevi unistd.h dosyasında bildirilmiştir.
int open
(const char *dosyaismi,
 int         seçenekler[, mode_t kip])
işlev
open işlevi, dosyaismi isimli dosya için bir dosya tanıtıcı oluşturur ve bunu döndürür. İlk olarak dosya konum göstergesi dosyanın başlangıcındadır. kip argümanı sadece dosya oluşturulurken kullanılır, ancak herhangi bir durumda argümanın bir zararı yoktur.
seçenekler argümanı dosyanın nasıl açılacağını belirler. Bu bir bit maskesidir ve ilgili parametreleri bit bit veyalayarak (C'de | işleci ile) değer oluşturabilirsiniz. Kullanılabilecek parametreleri Dosya Durum Seçenekleri bölümünde bulabilirsiniz.
open işlevinin normal dönüş değeri negatif olmayan bir tamsayı olarak dosya tanıtıcısıdır. Bir hata durumunda -1 değeri döner. Olağan dosya ismi hatalarına ek olarak aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EACCES
Dosya var ancak seçenekler argümanında istendiği gibi okunabilir/yazılabilir değil; dosya yok, dizine de yazılamadığından dosya oluşturulamıyor.
EEXIST
O_CREAT ve O_EXCL ikisi de belirtilmiş ve isimli dosya zaten var.
EINTR
open işlemi bir sinyal tarafından durduruldu. Bkz. Sinyallerle Kesilen İlkeller.
EISDIR
seçenekler argümanında yazma erişimi belirtilmiş ve dosya bir dizin.
EMFILE
Sürecin çok fazla açık dosyası var. Dosya tanıtıcılarının azami sayısı RLIMIT_NOFILE özkaynak sınırı tarafından denetlenir; bkz. Özkaynak Kullanımın Sınırlanması.
ENFILE
Dizini içeren sistemin tamamı ya da muhtemelen dosya sistemi, bu anda hiçbir ek açık dosyayı destekleyemiyor. (Böyle bir sorun GNU sisteminde asla olmaz.)
ENOENT
İsimli dosya yok ve O_CREAT belirtilmemiş.
ENOSPC
Yeni dosyayı içerecek dizin ya da dosya sistemi genişletilemiyor çünkü diskte yer yok.
ENXIO
O_NONBLOCK ve O_WRONLY ikisi de seçenekler argümanında belirtilmiş ve okumak için dosya açmış bir süreç yok.
EROFS
Dosya bir salt okunur dosya istemi üzerinde ve seçenekler argümanında O_WRONLY, O_RDWR ve O_TRUNC'dan biri belirtilmiş; veya O_CREAT belirtilmiş ve dosya mevcut değil.
Bir 32 bitlik makinede kaynaklar _FILE_OFFSET_BITS == 64 ile dönüştürülürse, open işlevi, 2^63 baytlık ve -2^63 ile 2^63 arasındaki konum sınırlı dosyalarda kullanılan dosya işleme işlevlerini etkinleştiren büyük dosya kipinde açılmış bir dosya tanıtıcı ile döner. Bu, tüm düşük seviyeli dosya işleme işlevleri büyük dosya kipindeki eşdeğerleri ile değiştirilerek kullanıcı bakımından şeffaf olarak yapılır.
Bu işlev çok evreli yazılımlarda bir iptal noktasıdır. open ç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 open çağrılarından kaçınmak için iptal eylemcileri kullanılarak korunulmalıdır.
open işlevi, akımları oluşturan fopen ve freopen işlevlerinin düşük seviyedeki karşılığıdır.
int open64
(const char *dosyaismi,
 int         seçenekler[, mode_t kip])
işlev
Bu işlev open işlevine benzer. dosyaismi isimli dosyaya erişim için kullanılabilen bir dosya tanıtıcı ile döner. Tek farkı bu işlevin 32 bitlik sistemlerde dosyayı büyük dosya (dosya uzunluğunun ve konum değerlerinin 63 bit genişlikte olduğu dosyalar) kipinde açmasıdır.
Kaynakların _FILE_OFFSET_BITS == 64 ile dönüştürülürdüğü durumda, bu işlev aslında open ismi altında kullanılır. Yani 64 bitlik yeni, genişletilmiş arayüz eski arayüzle şeffaf olarak değiştirilir.
int creat
(const char *dosyaismi,
 mode_t      kip)
artık kullanılmayan işlev
Bu işlev atıl olmuştur.
creat (dosyaismi, kip)
gibi bir çağrı:
open (dosyaismi, O_WRONLY | O_CREAT | O_TRUNC, kip)
çağrısına eşdeğerdir.
Bir 32 bitlik makinede kaynaklar _FILE_OFFSET_BITS == 64 ile dönüştürülürse, creat işlevi, 2^63 baytlık ve -2^63 ile 2^63 arasındaki konum sınırlı dosyalarda kullanılan dosya işleme işlevlerini etkinleştiren büyük dosya kipinde açılmış bir dosya tanıtıcı ile döner. Bu, tüm düşük seviyeli dosya işleme işlevleri büyük dosya kipindeki eşdeğerleri ile değiştirilerek kullanıcı bakımından şeffaf olarak yapılır.
int creat64
(const char *dosyaismi,
 mode_t      kip)
artık kullanılmayan işlev
Bu işlev creat işlevine benzer. dosyaismi isimli dosyaya erişim için kullanılabilen bir dosya tanıtıcı ile döner. Tek farkı bu işlevin 32 bitlik sistemlerde dosyayı büyük dosya (dosya uzunluğunun ve konum değerlerinin 31 bit genişlikte olduğu dosyalar) kipinde açmasıdır.
Bu dosya tanıtıcıları *64 biçiminde isimlendirilmiş işlevler (read64 gibi) dışında normal dosya işlemlerinde kullanılmamalıdır.
Kaynakların _FILE_OFFSET_BITS == 64 ile dönüştürülürdüğü durumda, bu işlev aslında creat ismi altında kullanılır. Yani 64 bitlik yeni, genişletilmiş arayüz eski arayüzle şeffaf olarak değiştirilir.
int close
(int dosyatanıtıcı)
işlev
Bu işlev dosya tanıtıcısı dosyatanıtıcı ile belirtilen dosyayı kapatır. Bir dosyanın kapatılma işlemi şöyle yürütülür:
  • Dosya tanıtıcı serbest bırakılır.
  • Dosyadaki süreç tarafından sahiplenilmiş kayıt kilitleri kaldırılır.
  • Bir boru ya da FIFO ile ilişkili tüm dosya tanıtıcılar kapatılır, okunmamış veri varsa iptal edilir.
Bu işlev çok evreli yazılımlarda bir iptal noktasıdır. close ç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 close çağrılarından kaçınmak için iptal eylemcileri kullanılarak korunulmalıdır.
close işlevinin normal dönüş değeri sıfırdır. Bir hata durumunda -1 değeri döner. Aşağıdaki errno hata durumları bu işlev için tanımlanmıştır:
EBADF
dosyatanıtıcı geçerli bir dosya tanıtıcı değil.
EINTR
Çağrı bir sinyalle durduruldu Bkz. Sinyallerle Kesilen İlkeller. EINTR hatasının düzgün olarak elde edilişine bir örnek:
TEMP_FAILURE_RETRY (close (desc));
ENOSPC
EIO
EDQUOT
Dosyaya NFS üzerinden erişilirken, write işlevinden kaynaklanan bu hatalar kimi zaman bir close çağrısına kadar saptanamaz. Bunun ne anlama geldiği Girdi ve Çıktı İlkelleri bölümünde açıklanmıştır.
Ayrı bir close64 işlevinin bulunmadığını aklınızdan çıkarmayın. Çünkü bu işlev dosya kipine bağımlı olmadığı gibi bunu saptamaya da çalışmaz. Bunu çekirdek bilir ve bir close çağrısı olduğunda gerekeni yapar.
Bir akımı kapatırken, fclose (bkz. Akımların Kapatılması) işlevini kullanmalısınız, işlevin düşük seviye eşdeğeri olan close ile kapatmaya çalışmayın. fclose işlevi tamponda bir veri varsa bunu boşaltır ve akım nesnesini kapandığını belirtecek şekilde günceller.
Önceki Üst Ana Başlık Sonraki
XIII. Oylum - Düşük Seviyeli Girdi ve Çıktı Başlangıç Girdi ve Çıktı İlkelleri
Bir Linux Kitaplığı Sayfası