Cómo determinar si Solaris admite E/S asíncronas
Es muy útil comprender la implementación de E/S asíncronas y llamadas al sistema en sistemas Solaris.
Enumerelo aquí para compartirlo con todos.
1. Código fuente:
/*
* Prueba rápida de kaio. Lea 1k bytes de un archivo mediante E/S asíncrona.
* Compilar:
* cc -o aio aio.c -laio
* Ejecutar:
* aio file_name
*/
#include lt;stdio.hgt;
#include lt;sys/types.hgt;
#include lt;sys /fcntl.hgt;
#include lt;sys/aio.hgt;
#define BSIZE 1024
main(int argc, char *argv[] )
{
aio_result_t res;
char buf[BSIZE]
int fd
si ((fd=open(argv[1], O_RDONLY)) == -1) {
perror("open");
exit(-1);
}
aioread(fd, buf, BSIZE, 0L, SEEK_SET, amp; res);
aiowait(0); res.aio_return == BSIZE) {
printf("aio tuvo éxito\n");
close( fd); /p>
}
perror("aio");
}
2. Compilar:
# cc - o aio aio.c -laio
3. Ejecute:
Primero pruebe el dispositivo básico:
# truss -t kaio, lwp_create ./aio /dev / rdsk/c0t0d0s1
kaio(5, 0xFFBEF640, 0x00000000, 0xFF21FB68, 0x00000000, 0xFFBEF648, 0x00000000) = 0
lwp_create( 0xFFBEF640, 0, 0xFF2 1FF5C) = 2
lwp_create() (devuelve nuevo lwp...) = 0
kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0
kaio(AIOWAIT , 0x00000000) = 4290706880
Éxito de AIO
Vemos que para el dispositivo sin formato, la llamada IO asíncrona final de Solaris se completa a través de AIOREAD y la operación asincrónica es exitosa.
Para lectura normal de archivos del sistema de archivos:
# truss -t kaio, lwp_create ./aio /a.sh
kaio(5, 0xFFBEF650, 0x00000000, 0xff21fb68, 0x00000000, 0xffbef658, 0x00000000) = 0
LWP_CREATE (0xffbef650, 0, 0xff21ff5c) = 2
lwp_create() (Regresar al nuevo LWP...) = 0 0
kaio(AIOREAD, 3, 0xFFBEF9D0, 1024, 0, 0xFFBEFDD0) Err#48 ENOTSUP
lwp_create(0xFFBEF5F0, 0, 0xFF20DF5C) = 3
lwp_create () (devuelto como nuevo lwp...). ) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1FBF5C) = 4
lwp_create() (devuelve nuevo lwp...) = 0
lwp_create(0xFFBEF5F0 , 0, 0xFF1E9F5C) = 5
lwp_create() (devuelve nuevo lwp....) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1D7F5C) = 6
lwp_create() (devuelve un nuevo lwp...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1C5F5C) = 7
lwp_create() (devuelve un nuevo lwp.. .. ) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1B3F5C) = 8
lwp_create() (devuelve nuevo lwp...) = 0
lwp_create(0xFFBEF5F0 , 0, 0xFF1A1F5C) = 9
lwp_create() (devuelve nuevo lwp...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF18FF5C) = 10
p>lwp_create() (devuelve un nuevo lwp...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF17DF5C) = 11
lwp_create() (devuelve un nuevo lwp... ) = 0
kaio(AIOWAIT, 0x00000000) = 1
kaio(AIONOTIFY, -13008896) = 0
AIO exitosa
Notamos que primero recibimos un error Err#48 para el sistema AIOREAD, lo que indica que el sistema de archivos no admitía IO asíncrona.
Finalmente, la operación tiene éxito y, de hecho, el sistema convierte la llamada IO asíncrona en una lectura previa.
En la salida completa del truss, puede ver la siguiente línea:
pread64(3, "7F E L F010201\0\0/0\0". , 1024, 0 ) = 1024
Y la IO asincrónica exitosa se completa leyendo la siguiente línea:
kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0.