Ответ на вопрос,
"как работает fread()?"
в основном
«он просит вашу операционную систему прочитать файл для вас».
Более или менее единственной целью ядра операционной системы является выполнение подобных действий от вашего имени. Ядро содержит драйверы устройств для дисков и файловых систем и может извлекать данные для вашей программы независимо от того, на чем хранится файл (например, на жестком диске, отформатированном в FAT32, в сетевой папке и т. д.).
Способ, которым функция fread() запрашивает вашу операционную систему для извлечения данных из файла, немного различается между ОС и процессором. В старые добрые времена MS-DOS функция fread() загружала различные параметры (вычисляемые из параметров, которые ваша программа передала функции fread()) в регистры процессора, а затем вызывала прерывание. Обработчик прерываний, который фактически был частью MS-DOS, затем брал запрошенные данные и помещал их в заданное место в памяти. Загружаемые регистры и вызываемое прерывание были указаны в руководствах MS-DOS. Параметры, которые вы передаете функции fread(), являются абстракциями тех, которые необходимы системному вызову.
Это то, что известно как системный вызов. Каждая операционная система имеет интерфейс системных вызовов. Библиотеки, такие как glibc в Linux, предоставляют удобные функции, такие как fread() (которая является частью стандартной библиотеки C), и выполняют за вас системный вызов (который не стандартизирован между операционными системами).
Обратите внимание, что это означает, что glibc не является фундаментальной частью операционной системы. Это просто библиотека подпрограмм, которая реализует стандартную библиотеку C вокруг системных вызовов, предоставляемых Linux. Это означает, что вы можете использовать альтернативную библиотеку C. Например, Android не использует glibc, несмотря на то, что у него есть ядро Linux.
Аналогично на винде. Все программное обеспечение в Windows (C, C++, среда выполнения .NET и т. д.) написано для использования библиотеки WIN32 API (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. Они не отдали это.
person
bazza
schedule
13.05.2018
FILE
, прочитайте члены этой структуры. откройтеvi /usr/include/libio.h
и найдите определениеFILE
. - person Achal   schedule 13.05.2018fread()
, для извлечения данных из фактического файла (конечно, при условии, что он был успешно открыт). Реализация функций чтения может использовать буфер, т.е. они копируют часть данных в память, чтобы оптимизировать доступ к фактическому файлу. Но такого рода вещи являются деталями реализации, о которых вам не нужно беспокоиться. И разыменование указателя файла для доступа к памяти — это не способ извлечения данных из файла. - person Peter   schedule 13.05.2018