На работе мы столкнулись с ошибкой при взаимодействии с дочерними процессами в деструкторе объекта и в итоге проследили ее до $? переменная перезаписывается во время вызовов ожидания. Это происходит после вызова exit(), поэтому $? дополнительно означал код возврата нашей программы в операционную систему.
В частности, perldoc говорил об ошибке такого рода:
Внутри подпрограммы END $? содержит значение, которое будет передано в exit(). Вы можете изменить $? в подпрограмме END, чтобы изменить статус выхода вашей программы.
Мы не хотим, чтобы это произошло, поэтому мы ставим local $?=$?;
внутри каждого блока END. Но теперь программы возвращают успех ОС, фактически терпя неудачу в заданной задаче.
Мне удалось разбить его на два примера программ. Тот, который работает по назначению, и тот, который терпит неудачу. Это происходит как в v5.8.8, так и в v5.10.1 для x86_64-linux-thread-multi.
Программа A: (возвращает 0 операционной системе)
END{ local $?=$?; }
exit(100);
Программа B: (возвращает операционной системе 100)
END{ local $?=$?>>8; }
exit(100);
Почему так важно, какое значение было присвоено local $?
в конце блока?