我正在研究一个C程序,有些进程需要访问嵌入式Linux上的共享内存。这个共享内存需要在创建时初始化。附加到此内存的任何进程都可能崩溃。当它重新启动时(可能是由linux INIT),它不能再次初始化共享内存,因为其他进程正在使用它。如何判断正在创建共享内存的进程的当前启动是第一次还是重新启动。我想出了一个在共享内存中分配一个整数的想法,其中将写为5678956(ffffffff或00000000以外的任何数字)之类的数字,以声称此内存已初始化。但我不确定这是否运行良好,因为关键数据存储了这个内存。任何意见,将不胜感激。感谢。
答案 0 :(得分:4)
您应该同时使用共享信号量和共享内存段。尝试使用sem_open
使用O_EXCL|O_CREAT
打开信号量,初始值为0.如果成功,则创建并初始化共享内存段,然后发布信号量并关闭它。如果以独占模式打开seamphore失败,请将其打开为非独占并等待信号量,然后将其关闭。
另一种解决方案,如果您愿意:在文件系统中使用带有mmap
和MAP_SHARED
的命名文件作为共享内存。首先使用临时名称创建文件,并使用它应包含的初始数据填充它。然后尝试将link
改为真实姓名。如果link
与EEXIST
失败,则您不是第一个进程,您可以删除临时文件并打开并映射现有文件。如果link
成功,那么您就是第一个过程。