В отличие от перенаправлений для других команд, перенаправления во встроенной exec
могут быть закрыты, когда оболочка выполняет внешнюю программу. POSIX допускает оба поведения . Ksh (как ATT ksh, так и pdksh и mksh) закрывают эти дескрипторы, когда они выполняют внешнюю утилиту (то есть для перенаправления на встроенную exec
, после вызова dup2
для выполнения перенаправления, они устанавливают флаг FD_CLOEXEC
на новом дескрипторе). Оболочка Bourne, dash, bash, zsh и BusyBox sh обрабатывают это перенаправление как любое другое перенаправление.
Более переносимым решением проблемы двух каналов ввода (при условии существования / dev / fd
) является выполнение другого перенаправления команды, которая считывает ввод, перемещая дескриптор файла в новый. Это дополнительное перенаправление не устанавливает флаг закрытия при выполнении для нового дескриптора.
sort a | { exec 3<&0; sort b | comm -12 /dev/fd/0 /dev/fd/4 4<&3; }
Это работает в pdksh / mksh и в ksh93r, но не в последних версиях ksh (93s + 2008-01-31 или 93u + 2012-08-01). Я не понимаю, что там делает ksh.
Я предполагаю, что память не освобождается до тех пор, пока conky не закроется или пока конфигурация не будет перезагружена.
Вместо того, чтобы создавать поверхность при каждом вызове drawimage
, вы могли бы создать функцию x, создающую поверхность, и функцию y, разрушающую поверхность, вызывать x из lua_startup_hook
и вызывать y из lua_shutdown_hook
. Таким образом, поверхность будет создаваться только один раз при запуске Conky или перезагрузке конфигурации и уничтожаться один раз при завершении работы Conky или перезагрузке конфигурации.
Подробнее о lua_startup_hook
и lua_shutdown_hook
см. man conky.