Dosya Konumu İlkeli
Önceki XIII. Oylum - Düşük Seviyeli Girdi ve Çıktı Sonraki
Dosya Konumu İlkeli
Bir akımın dosya konumunu fseek ile belirtiğiniz gibi, bir tanıtıcının dosya konumunu da lseek ile sonraki read veya write işlemleri için belirtebilirsiniz. Dosya konumlamanın ne olduğu ve daha fazlası için Dosyalarda Konumlama bölümüne bakabilirsiniz.
Bir tanıtıcıdan o anki dosya konumunu okumak için
lseek (tanıtıcı, 0, SEEK_CUR) çağrısını kullanabilirsiniz.
off_t lseek
(int   dosyatanıtıcı,
 off_t konum,
 int   nereye)
işlev
lseek işlevi dosyatanıtıcı tanıtıcısında dosya konumunu değiştirmek için kullanılır.
nereye argümanı fseek işlevindeki gibi konum'un nasıl yorumlanacağını belirtir. Değeri SEEK_SET, SEEK_CUR veya SEEK_END sembolik sabitlerinden biri olabilir.
SEEK_SET
nereye dosyanın başlangıcından itibaren karakter sayısını belirtir.
SEEK_CUR
nereye o anki dosya konumundan itibaren karakter sayısını belirtir.
SEEK_END
nereye dosya sonundan kaç karakter sayılacağını belirtir. Negatif bir değer dosya sonundan ileriye doğru, pozitif bir değer dosya sonundan geriye doğru karakter sayısıdır. Konumu sondan başa doğru belirtirseniz ve yazma yapıyorsanız, dosya, konuma kadar sıfırlarla doldurularak büyütülecektir.
lseek işlevinin normal dönüş değeri sonuçlanan dosya başlangıcından itibaren karakter sayısı olarak dosya konumudur. Bu özelliğini, o anki dosya konumunu öğrenmek için SEEK_CUR ile kullanabilirsiniz.
Dosyaya eklema yapmak isterseniz, dosya konumunu o anki dosya sonundan itibaren SEEK_END ile belirtmek yeterli olmaz. Siz dosya konumunu değiştirdikten sonra ancak yazmaya başlamadan önce başka bir süreç dosyaya bir miktar veri yazmış olabilir, dolayısıyla böyle bir konuma yapacağınız bir yazma işlemi mevcut verinin kaybına sebep olur. Bunun olmaması için O_APPEND işletim kipini kullanmalısınız; bkz. G/Ç İşlem Kipleri.
Dosya konumunu dosyanın o anki dosya sonundan başa doğru belirtebilirsiniz. Bu dosyanı kendisini uzatmaz; lseek dosyanın boyunu asla değiştirmez. Fakat aynı konuma daha sonra yapılan çıktılama dosyayı uzatır. Dosyanın önceki sonu ile yeni konum arası sıfırlarla doldurulur. Bu yolla uzatılan dosyada sıfırlardan oluşan bir "delik" oluşur, disk üzerinde yer ayırma yapılmaz, bu durumda dosya göründüğünden daha az alanı kapsar; bu durumdaki bir dosyaya "seyrek dosya" (sparse file) denir. Dosya konumu değiştirilemezse ya da işlem bir şekilde geçersiz olmuşsa, işlev -1 ile döner. Aşağıdaki errno hata durmları bu işlev için tanımlanmıştır:
EBADF
dosyatanıtıcı geçerli bir dosya tanıtıcı değil
EINVAL
nereye argümanının değeri geçersiz ya da sonuçlanan dosya konumu geçersiz. Bir dosya konumu geçersiz.
ESPIPE
dosyatanıtıcı, bir boru, FIFO ya da uçbirim gibi dosya konumlamasına izin verilmeyen bir nesneye karşılık olduğundan konunlama yapılamıyor. (POSIX.1 bu hatayı sadece borular ve FIFO'lar için belirtir, ancak GNU sisteminde konumlama yapılamayan her nesne için daima ESPIPE hatasını alırsınız.)
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse lseek işlevi aslında 2^63 bayta kadar dosyalarla çalışabilen ve 64 bitlik off_t türünde olan lseek64 işlevi olur.
Bu işlev çok evreli yazılımlarda bir iptal noktasıdır. lseek ç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 lseek çağrılarından kaçınmak için iptal eylemcileri kullanılarak korunulmalıdır.
lseek işlevi, akımlarda konumlama yapan fseek, fseeko, ftell, ftello ve rewind işlevlerinin düşük seviyedeki karşılığıdır.
off64_t lseek64
(int     dosyatanıtıcı,
 off64_t konum,
 int     nereye)
işlev
Bu işlev lseek işlevinin benzeridir. Farkı konum parametresinin 2^31 bayta kadar dosyalar için olan off_t türünde değil, 2^63 bayta kadar dosyalar için olan off64_t türünde olmasıdır. Bu işlev için kullanılan dosyatanıtıcı tanıtıcısının open64 ile açılması önemlidir. Aksi takdirde, küçük dosya kipinde açılmış dosya tanıtıcılarla off64_t türündeki dosya konumları hatalara yol açacaktır.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve lseek ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Bir dosyayı defalarca açarsanız ya da dup ile tanıtıcıyı çoğaltırsanız aynı dosya için çok sayıda tanıtıcınız olabilir. open çağrıları ile elde edilen tanıtıcıların dosya konumları birbirinden bağımsızdır dolayısıyla biri üzerinde kullanacağınız lseek diğerlerini etkilemez. Örneğin,
{
  int d1, d2;
  char buf[4];
  d1 = open ("foo", O_RDONLY);
  d2 = open ("foo", O_RDONLY);
  lseek (d1, 1024, SEEK_SET);
  read (d2, buf, 4);
}
     
foo dosyasının ilk dört karakterini okuyacaktır. (Gerçek br yazılımda gerekli olan hata denetimine, örneği karıştırmaması için yer verilmemiştir.)
Tersine olarak, çoğaltma yoluyla elde edilen dosya tanıtıcılar ortak bir dosya konumunu paylaşırlar. Biri üzerinde yapılan okuma, yazma, dosya konumu değiştirme gibi her işlem diğerlerini etkiler. Örneğin,
{
  int d1, d2, d3;
  char buf1[4], buf2[4];
  d1 = open ("foo", O_RDONLY);
  d2 = dup (d1);
  d3 = dup (d2);
  lseek (d3, 1024, SEEK_SET);
  read (d1, buf1, 4);
  read (d2, buf2, 4);
}
foo dosyasının 1024. karakterinden başlayarak dört karakter okur ve 1028. karakterden başlayarak dört karakter daha okur.
off_t
veri türü
Bu dosya boyutlarını göstermekte kullanıan bir veri türüdür. GNU sisteminde fpos_t veya long int türüne eşdeğerdir.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse, bu veri türü off64_t veri türüne eşdeğer olur.
off64_t
veri türü
off_t veri türüne benzer. Bir farkla: 32 bitlik makinelerde off_t 32 bitlikken off64_t 64 bitliktir. Böylece dosyalar 2^63 bayta kadar adreslenebilir.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse, bu veri türü off_t ismiyle kullanılır.
SEEK_… sabitleri için daha eski BSD sistemleri ile uyumluluk adına takma adlar tanımlanıştır. Bunlar iki ayrı başlık dosyasında tanımlıdır: fcntl.h ve sys/file.h.
L_SET
SEEK_SET için takma addır.
L_INCR
SEEK_CUR için takma addır.
L_XTND
SEEK_END için takma addır.
Önceki Üst Ana Başlık Sonraki
Girdi ve Çıktı İlkelleri Başlangıç Tanıtıcılar ve Akımlar
Bir Linux Kitaplığı Sayfası