2014-09-27 4 views
1

Я хочу прочитать последние n байтов файла proc/proc // status.как читать последние n байтов из файла proc в C

На обычных файлов, я могу FSEEK с конца файла, как:

fseek(proc_file, -BUF_SIZE, SEEK_END); 

, но так как файл прок имеет нулевой размер, это не работает.

Любые предложения о том, как читать с конца?

Я бы определенно хотел избежать петли до конца.

ответ

1

Файл состояния невелик. Просто Fread первые 10000 байт:

int fileLen = fread(statusFile, buffer, 10000); 

Fread возвращает количество байтов в файле вместе с содержимым файла. Затем вы можете проверить конец файла.

Нет смысла читать только последние несколько байтов. Файловые системы ввода-вывода буферизуются, так что запрос даже на несколько байтов приведет к тому, что нижние слои будут читать пару k в любом случае.

+0

Я бы поставил 1024 байта, должно быть достаточно. Я сделал 'для файла в $ (ls -1/proc | egrep '^ [0-9] + $'); do wc -c/proc/$ file/status 2>/dev/null; сделано | sort -n' в моей системе и минимум был 532, а максимальный - 850. Возможно, ошибаться на консервативной стороне и делать 4096. – mpontillo

+2

Буферизация WRT: это верно для нормальных файловых систем, но * не * true для procfs. Он не поддерживается блочным устройством, поэтому кэширования нет. Операции чтения выполняются непосредственно ядром. – duskwuff

+0

@Mike Я видел, как он переходил на 1k специально на кластеры, но да, я тоже в итоге использую 4k. –