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.