Я ищу эквивалент _filelength в Linux.
Это очень неправильный подход и показывает неправильное мышление. В Linux нет точного эквивалента _filelength
для Windows. Linux не Windows и Windows не Linux. Каждая операционная система имеет свой собственный API и свое видение файлов (в Linux они являются inode, см. inode (7) , а также этот ответ .. .), процессы и т. д. Linux в основном совместим с POSIX, поэтому изучите POSIX и прочитайте некоторую книгу по системному программированию в Linux, возможно, старый ALP или что-то более новое. Не ожидайте (и даже не пытайтесь) найти эквивалент каждой функции Windows или WinAPI в Linux. См. intro (2) , syscalls (2) , intro (3) .
Подробнее читайте stat (2) . Он принимает строку (некоторый путь к файлу), а не дескриптор файла (как это делает fstat
), как тот, который задан fileno (3) . Он может потерпеть неудачу (и вам нужно понять, почему, вероятно, используется errno (3) , который никогда не бывает отрицательным).
Кстати, идентификаторы с именем, начинающимся с _
, зарезервированы.
Возможно, вы могли бы попробовать:
long filelength(const char*filpath) { // don't use that. Learn POSIX API
struct stat st;
if (stat(filpath, &st)) /*failure*/
return -1; // when file does not exist or is not accessible
return (long) st.st_size;
}
но на практике вам лучше использовать stat
непосредственно в вашей программе (и проверять errno (3) при сбое , а не просто возвращать -1, как я делал выше ), и вам, вероятно, следует использовать другие метаданные, возвращаемые stat
.
Linux (и Unix) также имеют разреженные файлы , жесткие ссылки , файлы устройств , символические ссылки , анонимные файлы (например, все еще открытые inode, но больше не присутствуют в файловой системе), fifo (7) -s, unix (7) сокетов и т. д .... Возможно, вам нужно обрабатывать их (но у них нет точного эквивалента в Windows).
Читайте также Операционные системы: Three Easy Pieces
Вы можете использовать многоплатформенные фреймворки, такие как Poco или Boost или Qt . Они пытаются предоставить некоторую общую абстракцию над несколькими операционными системами (но некоторые детали все еще имеют значение и их трудно скрыть или абстрагировать; например, файл путь не совпадает в Windows и в Linux. См. path_resolution (7) ...)
Вы должны скомпилировать все предупреждения и отладочную информацию (поэтому gcc -Wall -Wextra -g
с GCC ). Затем используйте gdb
отладчик . Вы также можете использовать strace (1) для понимания системных вызовов , выполняемых вашей программой.