Я пытаюсь отслеживать вызов функции высокого уровня, который блокирует определенный процесс. Примером такого является scanf, который блокирует терминал, пока не получит '\ n'. Теперь я проследил scanf до getc (scanf использует getc для получения символов из stdin). Мой вопрос: какой процесс требуется для интерпретации данных, поступающих с клавиатуры, вплоть до ядра и возврата getc? Также как scanf останавливает терминал (компьютер работает на холостом ходу или работает над другой задачей)? Thank YouОтслеживание системного вызова C блокировки
ответ
Когда процесс выдает системный вызов (например, блокировка read(2)
), процесс запускается в режиме ядра, то есть код ядра, обрабатывающий конкретный системный вызов, вызывается.
После этого, в зависимости от основного устройства и драйвера, процесс может быть приостановлен и помещен в очередь ожидания. Когда нажата клавиша, вызывается код ядра, обрабатывающий прерывания, и оттуда вычитается, какая клавиша нажата.
Затем ядро возобновляет процесс, ожидающий ввода, и доставляет данные, копируя их из адресного пространства ядра в адресное пространство конкретного процесса.
Системный вызов позволяет программе пользователя запускаться в превалированном режиме. Когда пользовательская программа выполняет системный вызов, она генерирует прерывание 0x80. Когда ядро получит прерывание, он выполнит поиск в таблице дескрипторов прерываний (IDT) для 0x80 и выполнит соответствующий обработчик (syscall). После выполнения этого обработчика управление будет передано в пользовательскую программу после копирования информации из памяти ядра в пользовательскую память.
В этом случае scanf отображается в библиотечную функцию «читать». Системный вызов «read» вызывает «sys_read», который затем считывает из входного потока STDIN с помощью getc. Надеюсь это поможет!
Это не обязательно 'int 80h'. x86 также предоставляет SYSCALL/SYSENTER. –
- 1. Что означает «блокировка системного вызова»?
- 2. системного вызова() для вызова tkill()
- 3. Аргументы для системного вызова
- 4. Стоимость системного вызова
- 5. Работа системного вызова fork() (C-программа)
- 6. системного вызова в программе C на Windows,
- 7. Путаница относительно системного вызова fork() в C
- 8. Возвращаемое значение системного вызова в C
- 9. измерение скорости системного вызова
- 10. Выполнение системного вызова
- 11. сборка системного вызова неэффективная
- 12. Игнорирование системного вызова
- 13. Проблема системного вызова Sigsuspend
- 14. понимание системного вызова dup()?
- 15. Использование системного вызова open()
- 16. Объяснение системного вызова dup()
- 17. Ожидание завершения системного вызова
- 18. Получение значения системного вызова
- 19. Написание нового системного вызова
- 20. Чтение системного вызова Posix
- 21. Изменение системного вызова Fork()
- 22. Использование системного вызова read()
- 23. Код без системного вызова?
- 24. Внедрение собственного системного вызова
- 25. System.Net.Sockets.SocketException: сбой системного вызова
- 26. Применения системного вызова fork
- 27. Изменение системного вызова
- 28. Запуск системного вызова OpenSSL
- 29. Вилок вывод системного вызова:
- 30. Пример системного вызова
Вы просите нас указать вам на 'strace', или вы спрашиваете, как блокируют системные вызовы в целом? – cha0site
Если вам было интересно, как это делается на уровне ассемблера: http://www.programmersheaven.com/mb/x86_asm/295346/295346/keyboard-input/ :) – Vyktor
Попробуйте запустить его под отладчиком, например gdb. Хит-контроль-С, затем введите «bt». Scanf вызывает getc, который вызывает чтение, который является системным кодом, который не возвращается, пока на самом деле не будет чего-то читать. Вы заблокированы в чтении. – wildplasser