Kendi Özel Akımlarınızı Oluşturun
Önceki Diğer Akım Çeşitleri Sonraki
Kendi Özel Akımlarınızı Oluşturun
Bu bölümde girdiyi bir keyfi veri kaynağından alan ve sizin tarafınızdan tasarlanan bir veri alıcısına çıktılayan bir akımı nasıl oluşturabileceğiniz açıklanmaktadır. Buna özel akımlar diyoruz. Burada açıklanan işlev ve veri türlerinin hepsi GNU oluşumudur.
Özel Akımlar ve Çerezler
Her özel akımın içeriği çerez adı verilen özel bir nesnedir. Bu nesne sizin tarafınızdan sağlanır ve okunan veya yazılan verinin nereden alınacağı ve nereye yazılacağının kayıtlarından oluşur. Kütüphanedeki akım işlevleri doğrudan bu akımların içeriği ile çalışamaz ve hatta veri türünü bile bilmez; bunların adresleri void * türünde kaydedilir.
Bir özel akımı gerçekleştirmek için, verinin belirtilen yerden nasıl alınacağı veya nerede saklanacağını belirtmelisiniz. Bunu, akıma yazan, onu okuyan, dosya konumunu değiştiren ve kapatan kanca işlevleri tanımlayarak yaparsınız. Bu dirt işlev akımın çerezine aktarılacak, böylece onlar verinin nereden alınıp nerede saklanacağını söyleyebilecektir. Kütüphane işlevleri çerezin içinde neler olduğunu bilmez, ama sizin işlevleriniz bilmelidir.
Bir özel akımı oluştururken bir çerez göstericisi ve ayrıca cookie_io_functions_t yapısının kayıtlarında saklanan dört kanca işlevi belirtmelisiniz.
Burada sözü edilen oluşumlar stdio.h başlık dosyasında bildirilmiştir.
cookie_io_functions_t
veri türü
Bu veri yapısı, akım ile onun çerezi arasındaki iletişim protokolünü tanımlayan işlevleri saklar. Aşağıdaki üyelere sahiptir:
cookie_read_function_t *read
Bu, çerezden veriyi okuyan işlevdir. Değeri bir işlev değil de bir boş gösterici ise bu akımdan yapılan okuma işlemleri daima EOF döndürür.
cookie_write_function_t *write
Bu, çereze veriyi yazan işlevdir. Değeri bir işlev değil de bir boş gösterici ise bu akıma yazılan veriler iptal edilir.
cookie_seek_function_t *seek
Bu, çerez üzerindeki dosya konumlamasına eşdeğer işlemleri uygulayan işlevdir. Değeri bir işlev değil de bir boş gösterici ise bu akım üzerinde yapılan fseek veya fseeko çağrıları sadece tampon içinde konumlama yapar; tamponun dışına çıkan tüm konumlama istekleri bir ESPIPE hatası ile sonuçlanacaktır.
cookie_close_function_t *close
Bu, akım kapatılırken çerez üzerinde temizlik yapan işlevdir. Değeri bir işlev değil de bir boş gösterici ise bu akım kapatılırken çerezi kapatacak hiçbir özel işlem yapılmaz.
FILE *fopencookie
(void                 *çerez,
 const char           *açıştürü,
 cookie_io_functions_t gç-işlevleri)
işlev
Bu işlev, gç-işlevleri argümanında belirtilen işlevleri kullanarak çerez ile haberleşen bir akım oluşturur. açıştürü argümanı fopen işlevindeki gibi kullanılır; bkz. Akımların Açılması. (Fakat "açılışta kırp" seçeneği gözardı edilir.) Oluşturulan akımın tamamı tamponlanır.
fopencookie işlevi ya yeni oluşturulan akım ile ya da bir hata durumunda bir boş gösterici ile döner.
Özel Akım Kanca İşlevleri
Bu bölümde bir özel akımın gerektirdiği dört kanca işlevin tanımlanması ayrıntılı olarak incelenmiştir.
Çerezden veri okuyan işlevi şöyle tanımlamalısınız:
ssize_t okuyucu (void *çerez, char *tampon, size_t boyut)
Bu işlev read işlevine çok benzer; bkz. Girdi ve Çıktı İlkelleri. İşleviniz tampon tamponuna boyut bayt aktarmalı ve okunan bayt sayısı ile ya da dosyasonunu belirtmek üzere sıfır ile dönmelidir. Hata durumunu belirtmek için -1 de döndürebilirsiniz.
Çereze veri yazan işlevi şöyle tanımlamalısınız:
ssize_t yazıcı (void *çerez, const char *tampon, size_t boyut)
Bu işlev write işlevine çok benzer; bkz. Girdi ve Çıktı İlkelleri. İşleviniz tampon tamponundan boyut bayt aktarmalı ve yazılan bayt sayısı ile dönmelidir. Hata durumunu belirtmek için -1 de döndürebilirsiniz.
Çerez üzerinde konumlama yapan işlevi şöyle tanımlamalısınız:
int konumlayıcı (void *çerez, off64_t *konum, int nereden)
Bu işlev için konum ve nereden argümanları fgetpos işlevindeki gibi yorumlanır; bkz. Taşınabilir Dosya Konumlama İşlevleri.
Konumlama işleminden sonra, işleviniz sonuçlanan dosya konumunu dosyanın başlangıcına göre konum argümanında saklamalıdır. İşleviniz başarı durumunda 0 ve hata durumunda -1 ile dönmelidir.
Akımı kapatırken çerez üzerinde uygulanacak temizlik işlemlerini yapacak işlevi şöyle tanımlamalısınız:
int temizleyici (void *çerez)
İşleviniz başarı durumunda 0 ve hata durumunda -1 ile dönmelidir.
cookie_read_function
veri türü
Bu, bir özel akımın gerektirdiği okuyucu işlevin veri türüdür. İşlevi yukarıdaki gibi tanımlarsanız, bu, o işlevin veri türü olacaktır.
cookie_write_function
veri türü
Bu, bir özel akımın gerektirdiği yazıcı işlevin veri türüdür. İşlevi yukarıdaki gibi tanımlarsanız, bu, o işlevin veri türü olacaktır.
cookie_seek_function
veri türü
Bu, bir özel akımın gerektirdiği konumlayıcı işlevin veri türüdür.
cookie_close_function
veri türü
Bu, bir özel akımın gerektirdiği kapatma işlevin veri türüdür.
Önceki Üst Ana Başlık Sonraki
Yığınak Akımları Başlangıç Biçimli İletiler
Bir Linux Kitaplığı Sayfası