Вы создаете дочерний элемент, используя fork
, и этот дочерний элемент получает копию объекта $share
.Когда дочерний процесс завершается, дочерняя копия объекта $share
уничтожается, что приводит к уничтожению базовых системных ресурсов, поскольку вы использовали -destroy => 'yes'
.
В общем случае вы хотите создавать объекты с деструкторами после выполнения вилок.
Но при создании объекта IPC :: ShareLite вы обычно хотите оставить ключ, чтобы система могла выбрать ключ для вас, но вы должны сделать это перед созданиемвилки.
Обходной путь
Выполните следующие действия в отношении ребенка:
$share->destroy(0);
Лучшее решение
Поскольку обычный режим использования модуля включает создание объекта, унаследованного дочерними процессами, модуль должен справиться с этой ситуацией.
Для этого необходимо, чтобы сопровождающий модуля изменил модуль так, чтобы уничтожение происходило только в том случае, если текущий PID совпадает с PID, в котором был создан $share
.
sub _initialize {
...
$self->{pid} = $$; # ADD
...
}
sub DESTROY {
my $self = shift;
#destroy_share( $self->{share}, $self->{destroy} ) # REMOVE
destroy_share( $self->{share}, $self->{pid} == $$ ? $self->{destroy} : 0 ) # ADD
if $self->{share};
}