RAII и очистка системных ресурсов - PullRequest
2 голосов
/ 13 июля 2011

RAII - хорошее решение для очистки ресурсов. Однако RAII основан на разматывании стека. Если процесс завершается ненормально, стек не будет разматываться. Это означает, что RAII не будет работать в этой ситуации. Для ресурса времени жизни процесса не о чем беспокоиться, но для ресурса жизни файловой системы или ресурса времени жизни ядра, такого как файл, очередь сообщений, семафор, общая память, это будет проблемой.

Как надежно очистить системный (fs и kernal) ресурс?

Пример: Общий файл будет создаваться «основным» процессом и использоваться «подчиненным» процессом. Общий файл должен быть удален «основным» процессом в плане. Существует ли способ сделать это.

Очевидно, что общий файл не может быть отменен сразу после его создания. Если это так, другие процессы не могут «увидеть» файл.

1 Ответ

1 голос
/ 13 июля 2011

Нет идеального ответа на ваш вопрос. В основном вы просто смягчаете эффекты настолько, насколько можете, чтобы «ненормальное завершение, оставляя мусор позади», было редким.

Во-первых, напишите, что ваши программы должны быть максимально устойчивы к ненормальному завершению процесса.

Во-вторых, по возможности полагайтесь на механизмы ядра. В вашем примере с общим файлом, если вы просто говорите об одном «главном» и одном «подчиненном» процессе, использующем файл для связи, то вы можете отсоединить файл, как только его откроют оба процесса. Файл будет продолжать существовать и быть доступным для чтения и записи обоим процессам, пока оба они не закроют его, после чего ядро ​​автоматически освободит хранилище. (Даже если они оба заканчиваются ненормально.)

И, разумеется, при следующем запуске сервера он может очистить любой мусор, оставленный предыдущим запуском, если предположить, что одновременно может существовать только один.

Обычный механизм «последнего шанса» состоит в том, чтобы иметь процессы «очистки», которые периодически запускаются, например, для очистки /tmp.

.

Но то, что вы спрашиваете, принципиально сложно. Любой процесс, ответственный за обработку ненормального завершения другого, сам может завершиться ненормально. «Кто смотрит на наблюдателей?»

...