C Programlamada POSIX Okuma Fonksiyonu

Posix Read Function C Programing



Geleneksel POSIX uyumlu işletim sistemlerinde, bir dosya sisteminde bulunan bir belgeden bilgi almak için, bir program okuma sistemi çağrısını kullandı. Genellikle bir önceki açma çağrısından erişilen bir belge tanımlayıcı dosya tarafından tanımlanır. Bu okuma sistemi çağrısı, arayan kişinin belgeden belirttiği bilgileri bayt cinsinden ve tamsayı olarak okur ve ardından çağrı mekanizması tarafından sağlanan bir arabelleğe kaydeder.

Fonksiyon Tanımı

Kodunuzda okuma işlevini tanımlamadan önce, gerekli bazı paketleri eklemeniz gerekir.







#Dahil etmek

POSIX okuma işlevini şu şekilde tanımlarsınız:



>>ssize_t ön okuma(intfildişi,geçersiz *meraklısize_tnbayt, off_t ofset);
>>ssize_t okuma(intfd,geçersiz *meraklısize_tnbayt);

Read yöntemi çağrısından üç parametre argümanı alınabilir:



int fd: Bilgilerin okunacağı dosyanın dosya tanımlayıcısı. Bir açık sistem çağrısı yoluyla elde edilen bir dosya tanıtıcısı kullanıyor olabiliriz ya da sırasıyla tipik girdi, normal çıktı veya normal hataya atıfta bulunarak 0, 1 veya 2 kullanabiliriz.





Geçersiz *buf: Okunan verilerin kaydedileceği ve saklanacağı arabellek veya karakter dizisi.

Size_t nbayt: Kesmeden önce belgeden okunması gereken bayt sayısı. Okunacak bilgi nbayttan kısa ise tüm bilgiler arabellekte saklanabilir.



Açıklama

read() yöntemi, açık belge tanımlayıcısı 'Fildes' veya 'fd' ile bağlantılı dosyadan 'buf' tarafından belirtilen arabellek önbelleğine 'nbyte' baytları okumaya çalışır. Aynı akışta, FIFO'da veya terminal biriminde birden fazla eşzamanlı okumanın doğasını tanımlamaz.

Okumayı sağlayan belgelerde, okuma işlemi belgenin ofsetinden başlar ve ofset, okunan bayt sayısı kadar artırılır. Belge ofseti dosyanın kenarında veya ötesindeyse, okunan bayt yoktur ve read() hiçbir sonuç vermez.

Sayı 0 olduğunda, read() aşağıda belirtilen hataları tanıyacaktır. Hata yoksa veya read() Hatalarla birlikte açıklanmıyorsa, read() 0 sayısıyla sıfır verir ve bu nedenle başka bir etkisi yoktur.

Sayı, POSIX.1'e göre SSIZE_MAX'tan yüksekse, sonuç uygulama tarafından belirlenir.

Geri dönüş değeri

Başarı üzerine geri döndürülen 'okundu' ve 'önceden okunan' bayt sayısı negatif olmayan bir tam sayı olmalıdır, sıfır ise dosyanın sonunu gösterir. Belge konumu bu sayı ile ilerletilir veya bir hatayı belirtmek için yöntemler -1 döndürür ve 'errno' atar. Bu rakamın istenen bayt sayısından az olması hata baytı değildir. Şimdilik daha az bayt olması mümkün olabilir.

Hatalar

Bu hatalar meydana gelirse, oku ve oku işlevi başarısız olacaktır:

tekrar:

Belge veya dosya tanımlayıcı 'fd', engelleyici olmayan (O NONBLOCK) olarak etiketlenmiş ve okumayı engelleyecek olan, soket olmayan bir dosyaya aittir.

EWOULDBLOCK:

'fd' tanımlayıcısı, bloke olmayan (O_NONBLOCK) olarak etiketlenmiş bir sokete aittir ve okumayı engeller.

EBADF:

'fd' kullanılabilir bir tanımlayıcı olmayabilir veya okumaya açık olmayabilir.

EFAULT:

Bu, 'buf'unuz erişilebilir adres alanınızın dışında olduğunda olur.

EINTR:

Bilgi verilerinin okunmasından önce, arama bir sinyalle kesilmiş olabilir.

SEÇİM:

Bu hata, 'fd' tanımlayıcınız okumaya uygun olmayan bir nesneye dahil olduğunda veya belge O_DIRECT bayrağıyla çözüldüğünde ve 'buf'ta belirtilen bir veya diğer adres, 'count'ta belirtilen değer olduğunda oluşur. ' veya belge ofseti uygun şekilde ilişkilendirilmemiş.

SEÇİM:

'fd' tanımlayıcısı, timerfd_create(2) çağrısı kullanılarak oluşturulmuş olabilir ve okuma için yanlış boyutta arabellek verilmiş olabilir.

EIO:

Bu bir giriş/çıkış hatasıdır. Arka plan işlem grubu düzenleyici terminalinden okumaya çalıştığında ve biri veya diğeri SIGTTIN'i gözden kaçırdığında veya engellediğinde veya işlem grubu yaslandığında oluşur. Bu hatanın başka bir nedeni, sabit diskten veya banttan okurken düşük seviyeli giriş/çıkış hatası olabilir. Ağa bağlı veri dosyalarında EIO'nun bir başka olası nedeni, dosya tanımlayıcı üzerindeki tavsiye niteliğindeki kilitlemenin kaldırılması ve bu kilidin arızalanmasıdır.

EİSDİR:

Dosya tanımlayıcı 'fd' bir dizine aittir.

Notlar:

'fd' tanımlayıcısına bağlı nesneye bağlı olarak birçok başka hata da meydana gelebilir. Hem size_t hem de ssize_t formları, POSIX.1 tarafından tanımlanan işaretsiz ve işaretli sayısal veri türleridir. Linux'ta, okuma işlevi (ve eşdeğer sistem çağrıları) ile en fazla 0x7ffff000 (2.147.479.552) bayt iletilebilir ve orijinal olarak iletilen bayt sayısı döndürülür (hem 32-bit hem de 64-bit platformlarda). NFS dosya sistemlerinde, küçük bilgi akışları okunarak zaman damgasının değiştirildiği ilk anda, sonraki çağrılar bunu yapmaz. NFS istemcilerinin tümü olmasa da, st_atime (son dosya erişim zamanı) aracılığıyla sunucuya güncellemeyi bıraktığından ve istemcinin arabelleğinden gerçekleştirilen istemci tarafı okumaları, st-. sunucu tarafında okuma olmadığından sunucuda atime. İstemci tarafı öznitelik önbelleğe almayı kaldırarak UNIX meta verilerine erişilebilir, ancak bu, sunucudaki yükü önemli ölçüde artırır ve çoğu durumda üretkenliği etkiler.

Örnek 01:

İşte Linux Sisteminde okuma işlevi çağrısını gösteren bir C programı. Aşağıdaki komutu yeni bir dosyada olduğu gibi yazın. Kitaplıkları ekleyin ve ana işlevde bir tanımlayıcı ve boyut başlatın. Tanımlayıcı dosyayı açıyor ve dosya verilerini okumak için boyut kullanılıyor.

Yukarıdaki kodun çıktısı aşağıdaki resimde gösterildiği gibi olacaktır.

Örnek 02:

Okuma işlevinin çalışmasını gösteren başka bir örnek aşağıda verilmiştir.

Başka bir dosya oluşturun ve aşağıdaki kodu içinde olduğu gibi yazın. Burada, her ikisinin de kendi açık tablo dosyası erişimi olan iki tanımlayıcı, fd1 ve fd2 vardır. Yani foobar.txt için her tanımlayıcının kendi dosya konumu vardır. foobar.txt dosyasının ilk baytı fd2'den çevrilir ve sonuç c = f olur, c = o değil.

Çözüm

C programlamada POSIX okuma fonksiyonunu verimli bir şekilde okuduk. İnşallah şüphe kalmamıştır.