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.