Eşzamansız Okuma ve Yazma İşlemleri
Önceki Eşzamansız G/Ç Sonraki
Eşzamansız Okuma ve Yazma İşlemleri
int aio_read
(struct aiocb *aiocbp)
işlev
Bu işlev bir eşzamansız okuma işlemini ilklendirir. İşlem kuyruğa alındığında ya da bir hata oluştuğunda işlev beklemeksizin döner.
Tanıtıcısı aiocbp->aio_fildes olan dosyanın aiocbp->aio_offset bayttan itibaren ilk aiocbp->aio_nbytes baytı aiocbp->aio_buf'dan başlayan tampona yazılır.
Öncelikli G/Ç destekleyen platformlarda aiocbp->aio_reqprio değeri, istek kuyruğa alınmadan önceki önceliği ayarlamakta kullanılır.
İşlevin çağrıldığı süreç okuma isteğinin sonlaması halinde aiocbp->aio_sigevent değerine göre uyarılır.
aio_read işlevinin normal dönüş değeri sıfırdır. İşlem kuyruğa alınmadan önce bir hata oluşmuşsa işlev -1 ile döner ve bu durumda errno değişkenine şu değerlerden biri atanır:
EAGAIN
Özkaynak sınırları (geçici olarak) aşıldığı için istek kuyruğa alınmadı
ENOSYS
aio_read işlevi gerçeklenmedi
EBADF
aiocbp->aio_fildes tanıtıcısı geçersiz. Bu hata durumu isteğin kuyruğa alınmasından önce tanınmamış olabilir ve bu bakımdan bu hata ayrıca eşzamansız olarak sinyallenir.
EINVAL
aiocbp->aio_offset ya da aiocbp->aio_reqpiro değeri geçersiz. Bu hata durumu isteğin kuyruğa alınmasından önce tanınmamış olabilir ve bu bakımdan bu hata ayrıca eşzamansız olarak sinyallenir.
aio_read sıfırla dönerse, isteğin o anki durumu aio_error ve aio_return işlevleri ile sorgulanabilir. aio_error işlevinden dönen değer EINPROGRESS oldukça işlem henüz tamamlanmamış demektir. Eğer aio_error sıfırla dönerse işlem başarıyla bitmiş demektir; aksi takdirde, dönen değer bir hata kodu olarak değerlendirilmelidir. İşlem sonlanmışsa, işlemin sonucu aio_return çağrısı ile sağlanabilir. Dönen değer, eşdeğer read çağrısından dönen değerle aynıdır. aio_error çağrısından dönebilecek olası hata durumları şunlardır:
EBADF
aiocbp->aio_fildes tanıtıcısı geçersiz
ECANCELED
İşlem bitmeden durduruldu (bkz. Eşzamansız G/Ç İşlemlerinin İptal Edilmesi)
EINVAL
aiocbp->aio_offset değeri geçersiz
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işlev aslında aio_read64 işlevine karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
int aio_read64
(struct aiocb *aiocbp)
işlev
Bu işlev aio_read işlevine çok benzer. Tek fark, 32 bitlik makinelerde dosya tanıtıcısının büyük dosya kipinde açılmış olmasıdır. İçsel olarak, aio_read64 işlevi okumak için dosya konumlayıcıyı doğru yere konumlandırırken lseek64 (Dosya Konumu İlkeli) işlevselliğini kullanır, benzer şekilde aio_read işlevi de lseek işlevselliğini kullanır.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve aio_read ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Veriyi bir dosyaya eşzamansız yazmak için çok benzer bir arayüze sahip eşdeğer bir işlev çifti vardır.
int aio_write
(struct aiocb *aiocbp)
işlev
Bu işlev bir eşzamansız yazma işlemini ilklendirir. İşlem kuyruğa alındığında ya da bir hata oluştuğunda işlev beklemeksizin döner.
aiocbp->aio_buf'dan başlayan tampondaki ilk aiocbp->aio_offset bayt tanıtıcısı aiocbp->aio_fildes olan dosyaya aiocbp->aio_offset bayttan itibaren yazılır.
Öncelikli G/Ç destekleyen platformlarda aiocbp->aio_reqprio değeri, istek kuyruğa alınmadan önceki önceliği ayarlamakta kullanılır.
İşlevin çağrıldığı süreç yazma isteğinin sonlaması halinde aiocbp->aio_sigevent değerine göre uyarılır.
aio_write işlevinin normal dönüş değeri sıfırdır. İşlem kuyruğa alınmadan önce bir hata oluşmuşsa işlev -1 ile döner ve bu durumda errno değişkenine şu değerlerden biri atanır:
EAGAIN
Özkaynak sınırları (geçici olarak) aşıldığı için istek kuyruğa alınmadı
ENOSYS
aio_write işlevi gerçeklenmedi
EBADF
aiocbp->aio_fildes tanıtıcısı geçersiz. Bu hata durumu isteğin kuyruğa alınmasından önce tanınmamış olabilir ve bu bakımdan bu hata ayrıca eşzamansız olarak sinyallenir.
EINVAL
aiocbp->aio_offset ya da aiocbp->aio_reqpiro değeri geçersiz. Bu hata durumu isteğin kuyruğa alınmasından önce tanınmamış olabilir ve bu bakımdan bu hata ayrıca eşzamansız olarak sinyallenir.
aio_write sıfırla dönerse, isteğin o anki durumu aio_error ve aio_return işlevleri ile sorgulanabilir. aio_error işlevinden dönen değer EINPROGRESS oldukça işlem henüz tamamlanmamış demektir. Eğer aio_error sıfırla dönerse işlem başarıyla bitmiş demektir; aksi takdirde, dönen değer bir hata kodu olarak değerlendirilmelidir. İşlem sonlanmışsa, işlemin sonucu aio_return çağrısı ile sağlanabilir. Dönen değer, eşdeğer write çağrısından dönen değerle aynıdır. aio_error çağrısından dönebilecek olası hata durumları şunlardır:
EBADF
aiocbp->aio_fildes tanıtıcısı geçersiz
ECANCELED
İşlem bitmeden durduruldu (bkz. Eşzamansız G/Ç İşlemlerinin İptal Edilmesi)
EINVAL
aiocbp->aio_offset değeri geçersiz
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işlev aslında aio_write64 işlevine karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
int aio_write64
(struct aiocb *aiocbp)
işlev
Bu işlev aio_write işlevine çok benzer. Tek fark, 32 bitlik makinelerde dosya tanıtıcısının büyük dosya kipinde açılmış olmasıdır. İçsel olarak, aio_write64 işlevi okumak için dosya konumlayıcıyı doğru yere konumlandırırken lseek64 (Dosya Konumu İlkeli) işlevselliğini kullanır, benzer şekilde aio_write işlevi de lseek işlevselliğini kullanır.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve aio_write ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Az ya da çok geleneksel arayüzle bu işlevlerden başka, POSIX.1b bir defada birden fazla karışık okuma ve yazma işlemini ilklendiren bir işlev daha tanımlar. Bu işlev readv ve writev işlevlerinin bir birleşimi gibidir.
int lio_listio
(int                 kip,
 struct aiocb *const liste[],
 int                 isteksayısı,
 struct sigevent    *sinyal)
işlev
lio_listio işlevi bir defada birden fazla okuma ve yazma isteğini kuyruğa almakta kullanılabilir. İsteklerin hepsi aynı dosya için, farklı dosyalar için ya da bunlar arasındaki işlemler için olabilir.
lio_listio işlevi isteksayısı isteği liste ile gösterilen diziden alır. Uygulanacak işlem liste dizisinin her elemenındaki aio_lio_opcode elemanından saptanır. Bu alandaki değer LIO_READ ise dizinin bu elemenına bir aio_read çağrısı yapılmış gibi (bir farkla, sonlanma aşağıda belirtileceği gibi farklı bir yolla sinyallenir) okuma işlemi kuyruğa alınır. aio_lio_opcode üyesinin değeri LIO_WRITE ise yazma işlemi kuyruğa alınır. Bunlar dışında üyenin değeri LIO_NOP olmalıdır, bu durumda dizinin bu elemanı basitçe yoksayılır. Yoksayma işlemi, bütün elemenlar için işlem yapılmayacaksa istekleri içeren dizinin eleman sayısını değiştirmeden isteklerin ele alınması için faydalıdır. Başka durumda, lio_listio çağrısının tüm istekleri işleme sokmadan durdurulduğu durumdur (bkz. Eşzamansız G/Ç İşlemlerinin İptal Edilmesi). Bu durumda işleme sokulmayan istekler yinelenirken işleme sokulmuş istekler yoksayılabilir.
liste ile gösterilen dizinin yoksayılmayan elemanlarının üyeleri, evvelce aio_read ve aio_write işlevlerinin açıklamasında belirtilen işlemlere uygun değerlere sahip olmalıdır.
kip argümanı lio_listio işlevinin tüm istekler kuyruğa alındıktan sonra nasıl davranacağını saptamakta kullanılır. kip olarak LIO_WAIT belirtilmişse, tüm istekler tamamlanana kadar işlev bekler. Aksi takdirde, kip olarak LIO_NOWAIT verilebilir ki, bu durumda işlev, işlemler kuyruğa alındıktan hemen sonra işlemlerin bitmesini beklenmeden döner. Bu durumda, işlevi çağıran süreç tüm istekler için sinyal ile belirtilen değere bağlı olarak sonlanmaları ile ilgili bir uyarı alır. sinyal olarak NULL belirtilmişse herhangi bir uyarı gönderilmez. Aksi takdirde ya bir sinyal gönderilir ya da aio_read ve aio_write işlevlerinin açıklamalarında belirtildiği gibi bir evre başlatılır.
kip değeri LIO_WAIT ise ve tüm istekler yerine getirilmişse işlevin dönüş değeri sıfır olur. Aksi takdirde işlev -1 ile döner ve hata durumu errno değişkenine atanır. Hangi isteklerin başarısız olduğunu bulmak için liste dizisindeki her eleman için bir aio_error çağrısı yapılmalıdır.
kip değeri LIO_NOWAIT ise tüm istekler düzgün bir şekilde kuyruğa alınmışsa işlevin dönüş değeri sıfır olur. İsteklerin mevcut durumu aio_error ve aio_return çağrıları ile saptanabilir. İşlev bu kipte -1 ile dönerse, hata durumu errno değişkenine atanır. Bir istek henüz sonlanmamışsa bir aio_error çağrısı EINPROGRESS döndürür. Değer farklı olursa, istek bitmiş demektir, aio_error ya bir hata değeri ya da sıfır ile döner, bu durumda işlemin sonucu aio_return kullanılarak saptanabilir.
errno için olası değerler şunlardır:
EAGAIN
Tüm istekleri kuyruğa almak için gereken özkaynaklar şu anda yok. Hangi isteğin başarısız olduğunu bulmak için liste dizisinin tüm elemanları için hata durumuna bakmalısınız.
Bu hatanın başka bir sebebi de eşzamansız G/Ç isteklerinin sistem çapında sınırları aşması olabilirdi. Bu durum GNU sisteminde keyfi sınırlar olmadığından mümkün değildir.
EINVAL
Ya kip parametresi geçersiz ya da isteksayısı > AIO_LISTIO_MAX.
EIO
Bir ya da daha fazla G/Ç isteği başarısız oldu. Hangi isteğin başarısız olduğunu bulmak için liste dizisinin tüm elemanları için hata durumuna bakmalısınız.
ENOSYS
lio_listio işlevi desteklenmiyor
kip değeri LIO_NOWAIT ise ve istek iptal edilmişse bu istek için aio_error çağrısından dönen hata durumu ECANCELED olur.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işlev aslında lio_listio64 işlevine karşılıktır. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
int lio_listio64
(int                 kip,
 struct aiocb *const liste,
 int                 isteksayısı,
 struct sigevent    *sinyal)
işlev
Bu işlev lio_listio işlevinin benzeridir. Tek fark, 32 bitlik makinelerde dosya tanıtıcısının büyük dosya kipinde açılmış olmasıdır. İçsel olarak, lio_listio64 işlevi okumak için dosya konumlayıcıyı doğru yere konumlandırırken lseek64 (Dosya Konumu İlkeli) işlevselliğini kullanır, benzer şekilde lio_listio işlevi de lseek işlevselliğini kullanır.
Kaynak dosyası _FILE_OFFSET_BITS == 64 ile derlenmişse 32 bitlik sistemlerde bu işleve lio_listio ismiyle erişilir. Yani 32 bitlik arayüz 64 bitlik olanıyla değiştirilir.
Önceki Üst Ana Başlık Sonraki
Eşzamansız G/Ç Başlangıç Eşzamansız G/Ç İşlemlerinin Durumu
Bir Linux Kitaplığı Sayfası