我正在将现有的Win32代码移植到Linux。在Windows上,我有一个“主”进程,“读取器”,它创建一个共享内存对象然后等待一些“从”进程,“编写器”将数据放入共享内存中进行处理。
主进程:Win32实现依赖于
从进程:Win32实现与主进程几乎相同,只是
在Linux上,我有一个问题:从进程必须以某种方式“等待”主进程中的
从进程在
编辑:
目前,我不想直接使用文件系统。我喜欢使用“名称”创建一个“命名共享内存对象”,该名称将在两个平台上运行,如
我知道主进程和从进程在使用共享内存时必须互相配合。他们通过写入/读取内存来达到这一点。 “问题”在于shm_open / mmap可能导致从进程中的SIGBUS(ftruncate在主进程中晚)发生竞争。我测试了“fstat轮询”的效果,但想知道它是否被视为可怕的黑客行为,还是处理竞争的正确方法。
主进程:Win32实现依赖于
CreateFileMapping(INVALID_HANDLE_VALUE,[...]
然后是MapViewOfFile
。共享内存的大小在CreateFileMapping
调用中指定。将0作为MapViewOfFile
的最后一个参数传递可以确保映射所有共享内存。在Linux上,经过一些搜索后,我得出结论应该使用shm_open
+ ftruncate
+ mmap
。从进程:Win32实现与主进程几乎相同,只是
CreateFileMapping
被OpenFileMapping
取代,并且可以使用VirtualQuery
获取共享内存的大小。在Linux上,我有一个问题:从进程必须以某种方式“等待”主进程中的
ftruncate
调用完成。它们不能自己执行ftruncate
,因为它们还不知道共享内存的大小。从进程在
shm_open
和mmap
之间是否轮询fstat
是否可以呢?或者这是一种不好的做法,如果是,是否有另一种映射“正确”大小的方法?编辑:
目前,我不想直接使用文件系统。我喜欢使用“名称”创建一个“命名共享内存对象”,该名称将在两个平台上运行,如
"/MySharedMemName42"
,并且不想关心文件的位置。如果看起来不现实,我可能会改变主意。我知道主进程和从进程在使用共享内存时必须互相配合。他们通过写入/读取内存来达到这一点。 “问题”在于shm_open / mmap可能导致从进程中的SIGBUS(ftruncate在主进程中晚)发生竞争。我测试了“fstat轮询”的效果,但想知道它是否被视为可怕的黑客行为,还是处理竞争的正确方法。
CreateFileMapping
е’Ңд»ҺзЁӢеәҸдёӯзҡ„OpenFileMapping
д№Ӣй—ҙзҡ„з«һдәүе…ізі»пјҹ - chill