Estoy aprendiendo acerca de las funciones de bloqueo de E/S para escribir el controlador del dispositivo Linux y me pregunto cuál es el uso de ERESTARTSYS
. Considere lo siguiente:¿Qué usa ERESTARTSYS al escribir el controlador de Linux?
Variable global:
wait_queue_head_t my_wait_q_head;
int read_avail = 0;
Device_Init():
init_waitqueue_head(&my_wait_q_head);
device_read():
printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
DEVICE_WRITE():
read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
Cuando llamo a la read()
desde el espacio de usuario, el símbolo del sistema cuelgue hasta que yo llamo el write()
como se esperaba. Los mensajes printk
aparecen en consecuencia también en dmesg
. Sin embargo, estoy viendo algunos de los conductores escribe así:
Otra versión de device_read():
printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
Probé la segunda versión de device_read()
utilizando el mismo método en el espacio de usuario, y el resultado es exactamente lo mismo, entonces, ¿de qué sirve ERESTARTSYS?
p/s: He leído el libro Linux controlador de dispositivo en esto, pero yo no lo entiendo, alguien puede dar un ejemplo a eleborate ?:
Una vez que tengamos pasado esa llamada, algo nos ha despertado, pero no sabemos . Una posibilidad es que el proceso recibió una señal. La instrucción if que contiene la llamada wait_event_interruptible marca para este caso. Esta declaración garantiza la reacción adecuada y esperada a las señales, que podrían haber sido responsables de reactivar el proceso (ya que estábamos en una suspensión interrumpible). Si ha llegado una señal y no ha sido bloqueada por el proceso, el comportamiento correcto de es permitir que las capas superiores del kernel manejen el evento. A este extremo, el controlador devuelve -ERESTARTSYS a la persona que llama; este valor es utilizado internamente por la capa del sistema de archivos virtual (VFS), que reinicia la llamada al sistema o devuelve -EINTR al espacio del usuario. Usamos el mismo tipo de cheque para manejar el manejo de señales para cada lectura y la implementación de escritura .
Fuente: http://www.makelinux.net/ldd3/chp-6-sect-2
@Noge: para ver la diferencia, envíe una señal al proceso después de haber llamado 'read()' y antes de llamar a 'write()'. – caf