2012-02-03 11 views
6

Estoy intentando rastrear una llamada de función de alto nivel que bloquea un determinado proceso. Un ejemplo de esto es scanf, que bloquea el terminal hasta que recibe un '\ n'. Ahora rastreé scanf hasta el getc (scanf usa getc para adquirir caracteres de stdin). Mi pregunta es, ¿cuál es el proceso que lleva interpretar los datos que provienen del teclado, todo el kernel y el regreso de getc? Además, ¿cómo detiene scanf el terminal (está la computadora al ralentí o trabajando en otra tarea)? GraciasRastreo de una llamada al sistema de bloqueo C

+3

¿Nos está pidiendo que le indiquemos 'strace', o pregunta cómo funciona el bloqueo de llamadas del sistema en general? – cha0site

+1

Si estaba interesado en cómo se hace en el nivel de ensamblador: http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor

+2

Intente ejecutarlo bajo un depurador como gdb. Presione el control-C, luego escriba "bt". Scanf llama a getc, que llama a read, que es una llamada al sistema que no se devuelve hasta que hay algo que leer. Estás bloqueado en lectura. – wildplasser

Respuesta

5

Siempre que un proceso emite una llamada al sistema (como un bloqueo read(2)), el proceso comienza a ejecutar en modo de núcleo, es decir, el código del núcleo que controla la llamada de sistema en particular se invoca.

Después de eso, dependiendo del dispositivo subyacente y el controlador, el proceso se puede suspender y poner en espera-cola. Cuando se presiona una tecla, se invoca el código del kernel que maneja las interrupciones y a partir de allí se deduce qué tecla se presiona.

El núcleo luego reanuda el proceso que está esperando esta entrada y entrega los datos copiándolo del espacio de direcciones del kernel al espacio de direcciones del proceso particular.

1

La llamada al sistema permite que el programa del usuario se ejecute en modo prehabilitado. Cuando el programa de usuario realiza la llamada al sistema, genera la interrupción 0x80. Cuando el kernel recibe la interrupción, hará una búsqueda en la Tabla de Descripciones de Interrupción (IDT) para 0x80 y ejecutará el controlador correspondiente (syscall). Después de la ejecución de este controlador, el control se transferirá al programa del usuario después de copiar la información de la memoria del kernel a la memoria del usuario.

En este caso, scanf se asigna a la función de biblioteca, "leer". La llamada al sistema de "lectura" invoca "sys_read", que luego lee del flujo de entrada STDIN utilizando getc. ¡Espero que esto ayude!

+0

No es necesariamente 'int 80h'. x86 proporciona 'SYSCALL/SYSENTER' también. –

Cuestiones relacionadas