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