Утечка памяти Linux BASH при перенаправлении stdio

У меня есть где-то утечка памяти, но, похоже, она не связана с моей программой. Я делаю это смелое заявление, основываясь на том факте, что после того, как моя программа завершается обычным образом, с ошибкой сегментации или прерыванием, память не восстанавливается. Если бы виновата была моя программа, я бы предположил, что MMU восстановит все, но, похоже, это не так.

Утечка возникает только тогда, когда я перенаправляю стандартный вывод (в BASH версии 2.05 или 4) в файл, как в этом случае:

# my-program 

но это не:

# my-program > /mnt/sda1/log-output.txt

Скорость, с которой я печатаю на экран, составляет ‹ 2 Кб/сек. (Файл находится на USB-накопителе).

Любые идеи?

Связанный с этим вопрос здесь.


person Jamie    schedule 09.10.2009    source источник
comment
А как точно узнать, что у тебя утечка?   -  person EFraim    schedule 09.10.2009
comment
Сначала я знал, когда у меня возникла ошибка сегментации, и 40 из 45 мегабайт ОЗУ отсутствовали (это встроенная система). Я перезагрузил и перезапустил программу и проверил память с помощью этой команды for ((c=1;c;)) do cat /proc/meminfo && sleep 1; done | awk '/MemFree:/ { if ($2 < min || min == 0) min = $2; if ($2 > max || max == 0) max = $2; printf("%s\t%d (%d,%d)\n", $1, $2, min, max) }'   -  person Jamie    schedule 09.10.2009
comment
Вы проверили цифру для вашего кэшированного поля? Запись в файл, безусловно, может добавить к вашему кешу. Это уменьшит MemFree, но при необходимости его можно будет восстановить, чтобы вы не потеряли память как таковую.   -  person Chris Jester-Young    schedule 09.10.2009
comment
не работает ли он с любой другой оболочкой? Я не понимаю, как bash может это делать, поскольку он анализирует имя файла, открывает файл и разветвляет вашу программу с помощью дескриптора.   -  person Will Hartung    schedule 09.10.2009


Ответы (1)


Один только MemFree почти ничего не говорит.

Блочный уровень Linux много кеширует.

Вы можете увидеть, сколько используется для кэшей файловой системы (и других) в том же /proc/meminfo, о котором вы упомянули.

person EFraim    schedule 09.10.2009
comment
Тогда все в порядке! Я посмотрел на другие поля в /proc/meminfo и увидел, что поля Active: и Cached: значительно увеличиваются. У меня наверное нет утечки памяти. - person Jamie; 09.10.2009