在共享内存系统中,当两个进程共享一个共享内存段时,一个进程被杀死后,共享内存系统如何通知另一个正在运行的进程被杀死的进程?
答案1
处理这个问题的唯一方法是在进程之间使用某种心跳系统。例如,第一个进程可以在共享内存中共享其 PID。
后续进程可以通过发送诸如 SIGUSR1 之类的信号来宣布自己。然后他们可以继续每隔一段时间发送 SIGUSR2 作为心跳。连续两个丢失的 SIGUSR2 信号会告诉您该进程已经死亡。您需要使用 sigqueue(2) sigaction(2) 来传达信号发送者的 PID,才能使其正常工作。
另一种方法是将其他共享进程安排为第一个访问共享内存的进程的子进程。然后,孩子的死亡会导致自动向父母发送 SIGCHLD。即使您当前独立启动了共享进程,您也可以更改这些进程以向第一个进程发出新进程想要共享内存的信号。然后第一个进程可以分叉一个新的子进程来接管想要共享内存的进程的活动,从而保留父/子关系。
就我个人而言,我会首先看看更现代的 IPC 方法,例如 0MQ(去这里阅读指南)之前我会尝试使用 UNIX 内核服务来实现这一点。我什至会放弃共享内存,而使用memcache来共享数据。事实上,我已经实现了一个具有多个进程的系统,使用 0MQ 进行心跳和 IPC 并通过 memcache 共享内存。
答案2
事实并非如此。进程可以随时附加和分离到共享内存段,并且不会向其他附加进程发出通知(如果有的话)。