2016-05-12 4 views
4

Этот вопрос специфичен для perl, в контексте, что я специально задаюсь вопросом, что происходит с файловыми дескрипторами (как работающими, так и не), когда в какой-то момент скрипт die с открытыми ручками.Что происходит с завершением скрипта Perl?

Итак, какие операции выполняются по мере того, как выполнение происходит до последней строки сценария? Уровень скрипта? Уровень Perl? Уровень оболочки (например, bash)? Системный уровень (например, предположим современный * nix, такой как Ubuntu)?

Вот что информация я нашел до сих пор, хотя и не прямых ответов:

Best practices for terminating perl scripts

Ensure custom code is run upon exit in perl

Why to close file handles in perl (sys buffers)

Perldoc на die и exit говорят в основном самих функций.

+1

Ручки закрыты. – Mort

+0

@Mort: ссылка perlmonks говорит так же. – tniles09

ответ

1

Perl использует стратегию подсчета ссылок для сбора мусора. Когда счетчик ссылок переменной достигает 0, вызывается любой применимый метод DESTROY до освобождения его памяти в системе управления памятью perl.

По мере того, как ваша программа завершается, оставшиеся переменные выходят за пределы области действия и уменьшают счетчик ссылок. Это тот момент, когда ваши файлы будут закрыты.

Когда perl завершит свою очистку, он вернется в операционную систему, после чего оставшиеся ресурсы будут возвращены ОС, а его родительский процесс (возможно, init или оболочка) будет проинформирован статуса выхода.


Где подсчет ссылок может пойти наперекосяк: Если создать структуру данных с циклическими ссылками, ни одна из переменных компонентов не будет, естественно, количество ссылок упадет до 0, если вы либо ослабить одну из ссылок или явно вызвать его DESTROY способ. В этом случае переменные будут сохраняться до конца программы, после чего perl будет DESTROY и/или мусор собирает все, независимо от его количества ссылок.

+0

Не могли бы вы рекомендовать какие-либо ресурсы для дальнейшего изучения/чтения этих тем? Я нашел [это] (http://perldoc.perl.org/index-internals.html), но он покрывает много места. – tniles09

+0

@ tniles09 Если вы используете переменные не более сложные, чем вложенные массивы и хэши, то вы можете просто предположить, что они будут пожинать, когда их последняя ссылка выходит за рамки. Если вы используете круговые структуры данных, тогда [этот раздел perlref] (http://perldoc.perl.org/perlref.html#Circular-References) должен быть достаточно. Если вы разрабатываете интерфейсы для API-интерфейсов C через XS или Inline :: C, тогда вам могут быть интересны * все * внутренние документы, с которыми вы связаны. – tjd

+0

Вызов 'DESTROY' не приведет к тому, что счетчик ссылок опустится до нуля. Не может быть даже метода 'DESTROY' для вызова. –

-1

Сбор мусора будет выполнять дорогостоящую операцию маркировки/развертки, если ваши указатели/обработчики файлов не будут надлежащим образом уволены.

На уровне perl находится сбор мусора. На оболочке нормальные interuptors и обработчики ошибок по-прежнему будут получать IO. На системном уровне сбор мусора будет выдавать системные вызовы для перераспределения памяти.

 Смежные вопросы

  • Нет связанных вопросов^_^