Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 修改内存映射文件时发出通知/信号_C_Linux_Ipc - Fatal编程技术网

C 修改内存映射文件时发出通知/信号

C 修改内存映射文件时发出通知/信号,c,linux,ipc,C,Linux,Ipc,我目前正在共享数据(目前实现为每个“阅读器”不断轮询“head”字段,并在其更改时读取新数据 持久性(文件备份) 如果任何“读卡器”/“写卡器”进程突然终止,恢复系统应该像重新启动进程一样简单。 -->目前,IPC共享数据保存在磁盘上备份的mmap ed文件中 什么是 -快速(低延迟)和 -轻量级(低cpu使用率)替代方案,以实现某种事件机制,在每次事件发生时通知读卡器进程 mmap ed区域是否由写入程序进程修改 注意:在读卡器进程中,当写入程序进程更新mmap ed内存时(即使在调用后),在

我目前正在共享数据(目前实现为每个“阅读器”不断轮询“head”字段,并在其更改时读取新数据

  • 持久性(文件备份)
    如果任何“读卡器”/“写卡器”进程突然终止,恢复系统应该像重新启动进程一样简单。
    -->目前,IPC共享数据保存在磁盘上备份的mmap ed文件中

  • 什么是
    -快速(低延迟)和
    -轻量级(低cpu使用率)替代方案,以实现某种事件机制,在每次事件发生时通知读卡器进程 mmap ed区域是否由写入程序进程修改


    注意:在读卡器进程中,当写入程序进程更新mmap ed内存时(即使在调用后),在mmap ed文件上添加手表不会导致任何事件。

    在所有阻塞通信中,读卡器抓取数据,其他读卡器无法读取数据

    • 您可以创建一个读卡器链。这是不好的,因为在您的情况下,进程可能会突然结束
    • 使用多个管道。每次创建读卡器时,读卡器都可以要求编写器打开一个管道,然后读卡器可以订阅该管道并读取它。此外,编写器可以向读卡器发送数据当前状态的副本,除非读卡器可以自己访问它
    • 使用信号。您可以在每次写入后从写入程序向所有读卡器发送信号
    不过,这是一个棘手的问题……这些就是我所得到的一切……

    (发布实际使用的解决方案供将来参考)

    使用此修补程序

    • reader流程可以使用inotify框架
    • 以重要/重要的间隔监视mmap ed文件上的更改
    • 编写器进程调用同一mmap ed文件上的
      sync()
      触发

    从手册页,
    对于文件备份映射,映射文件的时间字段可以在mmap()之间的任何时间更新和相应的取消映射;对映射页面的第一次引用将更新该字段(如果尚未更新)。使用PROT_WRITE和MAP_SHARED映射的文件的st_ctime和st_mtime字段将在写入映射区域后,在后续msync(2)之前更新使用MS_SYNC或MS_ASYNC标志(如果出现)。
    -这会有帮助吗?您应该使用某种同步原语(信号量/互斥)。您可以将其放在映射区域。无论如何,您都应该使用它来避免争用条件,当一个进程写入,另一个进程同时读取相同的内存时。@VoidPointer因此在读卡器进程中,我必须不断重复调用文件上的stat()。@zch,因为始终只有一个“writer”,我相信我们可以不使用任何锁定机制(以实现更快的性能)。因此,除非绝对必要,否则我希望避免锁定。我还用当前实现的典型用法和详细信息更新了Q。@zch基本上是在尝试避免使用信号量/mutex,以免由于阻塞而降低性能(饥饿)如中所述。因为我只需要一个事件,即通知机制来重构读卡器代码,使其等待事件,而不需要重复轮询cpu周期。