Как работает scanf () внутри ОС? - PullRequest
7 голосов
/ 10 августа 2009

Мне было интересно, как scanf () / printf () на самом деле работает на аппаратном уровне и уровне ОС. Где поток данных и что именно делает ОС в это время? Какие звонки делает ОС? И так далее ...

Ответы [ 4 ]

23 голосов
/ 10 августа 2009

scanf () и printf () являются функциями в libc (стандартная библиотека C), и они вызывают системные вызовы read () и write () соответственно, обращаясь к файловым дескрипторам stdin и stdout соответственно (fscanf и fprintf) позволяет указать поток файлов, из которого вы хотите читать / записывать).

Вызовы read () и write () (и все системные вызовы) приводят к «переключению контекста» из приложения уровня пользователя в режим ядра, что означает, что оно может выполнять привилегированные операции, такие как непосредственный обмен данными с оборудованием. В зависимости от того, как вы запустили приложение, файловые дескрипторы 'stdin' и 'stdout', вероятно, связаны с консольным устройством (таким как tty0) или каким-либо виртуальным консольным устройством (например, предоставляемым xterm). read () и write () безопасно копируют данные в / из буфера ядра, называемого 'uio'.

Часть преобразования строк формата в scanf и printf не происходит в режиме ядра, но только в обычном пользовательском режиме (внутри 'libc'), общее правило с системными вызовами заключается в том, что вы переключаетесь в режим ядра как можно реже как во избежание снижения производительности при переключении контекста, так и в отношении безопасности (вам нужно быть очень осторожным со всем, что происходит в режиме ядра! меньше кода в режиме ядра означает меньше ошибок / дыр в безопасности операционной системы).

кстати ... все это было написано с точки зрения Unix, я не знаю, как работает MS Windows.

1 голос
/ 10 августа 2009

В моей ОС я работаю с scanf, и printf основаны на функциях getch () ant putch ().

0 голосов
/ 25 марта 2018

scanf, printf и т. Д. Внутренне все эти типы функций не могут быть написаны напрямую на языке c / c ++. внутренне все они написаны на ассемблере с использованием keword "asm" , любая вещь, написанная с ключевым словом "asm", напрямую вводится в объектный файл независимо от компиляции (даже не изменяется после компиляции), и на языке ассемблера у нас есть предопределенные коды, которые могут реализовать все эти функции ...... так что вкратце SCANF PRINTF и т. д. ВСЕ НАПИСАНЫ НА ЯЗЫКЕ В СБОРЕ ВНУТРЕННЕ. ВЫ МОЖЕТЕ ПРОЕКТИРОВАТЬ СВОЮ СОБСТВЕННУЮ ФУНКЦИЮ ВВОДА С КЛАВИШЕЙ "ASM" .

0 голосов
/ 10 августа 2009

Я думаю, что ОС просто предоставляет два потока, один для ввода и другой для вывода, потоки абстрагируют от того, как представлены выходные данные или откуда поступают входные данные.

так что scanf & printf просто добавляет байты (или потребляет байты) из любого потока.

...