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
Respuesta
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.
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!
No es necesariamente 'int 80h'. x86 proporciona 'SYSCALL/SYSENTER' también. –
- 1. C#: Sistema de rastreo GPS
- 2. Ignorando una llamada al sistema
- 3. ¿Cómo redirigir la salida de una llamada al sistema al interior del programa en C/C++?
- 4. En Python, ¿cómo puedo hacer una llamada al sistema sin bloqueo?
- 5. ¿Llamada al sistema sin cambio de contexto?
- 6. Llamada al sistema e interruptor de contexto
- 7. Dirección incorrecta al agregar una llamada al sistema
- 8. Windows C llamada al sistema con espacios en el comando
- 9. Seleccionar() llamada al sistema en hilos?
- 10. Llamada al sistema vs Llamada a la función
- 11. Usando la llamada al sistema open()
- 12. Cómo untaint llamada al sistema en CGI.pm
- 13. ¿Cómo puedo añadir una llamada al sistema/utilidad en xv6
- 14. ¿Al agregar un esclavo redis se emite una llamada de bloqueo al maestro?
- 15. Rastreo de rastreo para un determinado puerto
- 16. valor de retorno de llamada al sistema vfork()
- 17. Detener un hilo atascado en una llamada de bloqueo
- 18. interrumpido llamada al sistema con cola de procesamiento
- 19. alta velocidad de rastreo
- 20. Cómo capturar el resultado de una llamada al sistema en una variable de shell?
- 21. C#: Bloqueo de una llamada de función hasta que se cumpla la condición
- 22. Capturar una llamada al sistema justo antes de que el control ingrese a una biblioteca compartida
- 23. Sockets C/C++ y un recv no de bloqueo()
- 24. Capture el estado de salida y la salida de una llamada al sistema en R
- 25. Instalación del paquete mediante la llamada al sistema CLI/Ruby
- 26. ¿Cómo se implementa la llamada al sistema en Linux?
- 27. Llamada al sistema Unix fork() ¿qué se ejecuta cuando?
- 28. Cómo manejar EINTR (llamada de sistema interrumpida)
- 29. ¿Cómo agregar el rastreo (simple) en C#?
- 30. Llamada al sistema Linux para crear proceso e hilo
¿Nos está pidiendo que le indiquemos 'strace', o pregunta cómo funciona el bloqueo de llamadas del sistema en general? – cha0site
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
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