A única maneira de lidar com isso seria ter algum tipo de sistema de heartbeat entre os processos. Por exemplo, o primeiro processo poderia compartilhar seu PID na memória compartilhada.
Processos subseqüentes podem se anunciar enviando um sinal como SIGUSR1. Então eles poderiam continuar enviando SIGUSR2 em intervalos como um batimento cardíaco. Dois sinais SIGUSR2 em falta diriam que o processo tinha morrido. Você precisaria usar sigqueue (2) sigaction (2) para comunicar o PID do remetente do sinal para que isso funcione.
Outra maneira é organizar os outros processos de compartilhamento como filhos do primeiro processo para acessar a memória compartilhada. Então a morte de uma criança resulta em um SIGCHLD automático para o pai. Mesmo se atualmente você tem os processos de compartilhamento iniciados independentemente, você pode alterá-los para sinalizar o primeiro processo que um novo processo deseja compartilhar memória. Em seguida, o primeiro processo pode bifurcar um novo filho para assumir a atividade do processo que deseja compartilhar a memória, preservando assim o relacionamento pai / filho.
Pessoalmente, eu primeiro observaria um método IPC mais moderno como o 0MQ ( clique aqui e leia o guia ) antes de tentar implementar isso com os serviços do kernel do UNIX. Eu até desistiria da memória compartilhada e usaria o memcache para compartilhar os dados. Na verdade eu implementei um sistema com vários processos usando o 0MQ para heartbeats e IPC e compartilhando memória via memcache.