Ответ на вопрос
"как работает fread ()?"
в основном
"он просит вашу операционную систему прочитать файл для вас."
Более или менее единственной целью ядра операционной системы является выполнение таких действий, какэто от вашего имени.В ядре размещены драйверы устройств для дисков и файловых систем, и он может извлекать данные для вашей программы независимо от того, где хранится файл (например, жесткий диск в формате FAT32, сетевой ресурс и т. Д.).
Способ, которым fread () запрашивает у вашей операционной системы выборку данных из файла, немного отличается в зависимости от ОС и процессора.В старые добрые времена MS-DOS функция fread () загружала различные параметры (рассчитанные из параметров, которые ваша программа передала fread ()) в регистры ЦП, а затем вызывала прерывание.Обработчик прерываний, который на самом деле был частью MS-DOS, затем отправлял запрашиваемые данные и помещал их в определенное место в памяти.Регистры, которые должны быть загружены, и вызываемое прерывание были определены в руководствах MS-DOS.Параметры, передаваемые в fread (), являются абстракциями тех, которые нужны системному вызову.
Это то, что называется системным вызовом.Каждая операционная система имеет интерфейс вызова системы.Такие библиотеки, как glibc в Linux, предоставляют удобные функции, такие как fread () (которая является частью стандартной библиотеки C) и выполняют системный вызов для вас (который не стандартизирован между операционными системами).
Обратите внимание, что это означаетчто glibc не является фундаментальной частью операционной системы.Это просто библиотека подпрограмм, которая реализует стандартную библиотеку C вокруг системных вызовов, которые предоставляет Linux.Это означает, что вы можете использовать альтернативную библиотеку C.Например, Android не использует glibc, даже если у него ядро Linux.
Аналогично в Windows.Все программное обеспечение в Windows (C, C ++, среда выполнения .NET и т. Д.) Написано для использования библиотеки API WIN32 (win32.dll).Разница в Windows заключается в том, что интерфейс системного вызова ядра NT не публикуется;мы не знаем что это.
Это приводит к некоторым интересным вещам.
- WINE в Linux воссоздает WIN32.dll, а не интерфейс системного вызова ядра NT.
- Подсистема Windows для Linux в Windows 10 воссоздает интерфейс системных вызовов Linux (что возможно, потому что это общеизвестно).
- Solaris, QNX и FreeBSD используют один и тот же прием.
- Еще более странно, что похоже, что MS разработала оболочку интерфейса системы NT для Linux (то есть то, чего не сделал WINE), чтобы MS-SQLServer мог работать в Linux.По сути, это подсистема Linux для Windows.Они не отдали это.