RAII и очистка системных ресурсов
RAII - хорошее решение для очистки ресурсов. Однако RAII основан на разматывании стека. Если процесс завершится ненормально, стек не будет размотан. Это означает, что RAII не будет работать в этой ситуации. Для ресурса времени жизни процесса не о чем беспокоиться, но для ресурса жизненного цикла файловой системы или ресурса времени жизни ядра, такого как файл, очередь сообщений, семафор, общая память, это будет проблемой.
Как надежно очистить системный (fs и kernal) ресурс?
Пример: общий файл будет создан "основным" процессом и будет использоваться "подчиненным" процессом. Общий файл должен быть удален "основным" процессом в плане. Существует ли способ сделать это.
Очевидно, что общий файл не может быть отменен сразу после его создания. Если это так, другие процессы не могут "увидеть" файл.
1 ответ
Нет идеального ответа на ваш вопрос. В основном вы просто смягчаете эффекты настолько, насколько можете, так что "ненормальное завершение, оставляющее мусор позади", встречается редко.
Во-первых, напишите свои программы, чтобы они были максимально устойчивы к ненормальному завершению процесса.
Во-вторых, по возможности полагайтесь на механизмы ядра. В вашем примере с общим файлом, если вы просто говорите об одном "главном" и одном "подчиненном" процессе, использующем файл для связи, вы можете отсоединить файл, как только оба процесса откроют его. Файл будет продолжать существовать и быть доступным для чтения и записи обоим процессам, пока оба они не закроют его, после чего ядро автоматически освободит хранилище. (Даже если они оба заканчиваются ненормально.)
И, конечно же, в следующий раз, когда ваш сервер запустится, он может очистить любой мусор, оставленный предыдущим запуском, если предположить, что одновременно может существовать только один.
Обычный механизм последнего шанса состоит в том, чтобы иметь процессы "очистки", которые периодически запускаются (например) для выметания / tmp.
Но то, что вы спрашиваете, принципиально сложно. Любой процесс, ответственный за обработку ненормального завершения другого, сам может завершиться ненормально. "Кто смотрит на наблюдателей?"