在 linux,C 中,使用共享内存,我有一个 Writer 进程和许多 Reader。
当 Writer 终止时,所有正在运行的 Reader 都会挂起。Writer 在终止时会执行 shm_unlink。
我想,可能是错误的,内核知道读者并且他们可以继续阅读。当然数据不会改变,所以读者可以知道什么时候优雅地结束。
任何想法如何做到这一点?
您可以在共享内存中创建的标头中有一个标志来指示 EOF。您可以定期更新时间戳以检测写入器不干净的终止/
您还可以使用 shmctl 找出关联的人数,这可能有助于您确定作者是否已经离开。
您也可以尝试重新附加/fstat 以验证该段没有被删除。
如果这些答案不满足,请告诉我们是 POSIX 还是 System V 共享内存。
在 linux 中,内核不知道您的读者或作者(或者,它不知道哪个是哪个)。并且shm_unlink
只是删除名称;在所有用户取消映射并关闭或终止之前,它不会删除 shmem 段。如果您让这些读取器/写入器通过 pshared互斥体/信号量进行通信和阻塞,那么当写入器死亡时,您确实可能最终导致读取器挂起。最好让作者在队列中留下一条消息,告诉读者它正在终止。