lseek
является основой для C fseek
, поэтому он имеет аналогичную семантику, соответствующую fseek
- и совершенно не связан с другими областями Unix API.Что касается провенанса, вы ожидаете, что lseek
будет действовать как получение файлового дескриптора fseek
, а fseek
- это интерфейс C-библиотеки, который появился без привязки к Unix.
stat
специфичен только для Unix и делает свое дело.Разумная разница, если вы думаете о происхождении.Конечно, проблема в том, что API C имеют очень слабые модели типов, потому что C на один шаг не позволяет обеспечить истинную безопасность типов.
Почему это важно?Потому что, по сути, seekable_size и file_object_size - это две принципиально разные концепции, которые требуют разных типов - даже стандартная библиотека C ++ ошибается.
Но в то время как в C ++ и с современными компиляторами это теперь совершенно унаследованный недостаток, в C действительно нет способа эффективно объединить целые числа в несовместимые типы без снижения производительности и читабельности кода.И, таким образом, вы получите что-то вроде offs_t
или long
, используемое для совершенно несовместимых понятий.И это является источником путаницы: только то, что вы получаете число, связанное с размером, из функции, связанной с файлом, не означает, что число будет иметь то же значение.А значения обычно фиксируются в типах ... Единственное значение, которое присуще long
, по своей сути - это «эй, я число, вы можете делать со мной числовые вещи»…: (