我正在使用C编写的程序,即某些进程需要访问嵌入式Linux上的共享内存。这个共享内存需要在创建时进行初始化。附加到此内存的任何进程可能会崩溃。当它重新启动时(可能由linux INIT),它不能再次初始化共享内存,因为其他进程正在使用它。如何判断当前正在创建共享内存的进程是第一次启动还是重新启动。我想出了一个想法,它在共享内存中分配一个整数,写入一个数字,如5678956(除ffffffff或00000000之外的任何数字),以声明此内存已被初始化。但是我不确定这是否正常工作,因为关键数据是存储这些内存。任何意见,将不胜感激。谢谢。如何判断是否是第一次启动进程
3
A
回答
4
您应该同时使用共享信号量和共享内存段。尝试使用sem_open
使用O_EXCL|O_CREAT
和初始值0打开信号量。如果成功,则创建并初始化共享内存段,然后发布信号并将其关闭。如果在排他模式下打开seamphore失败,打开它非独占并等待信号量,然后关闭它。
另一种解决方案,如果您愿意:在文件系统中使用mmap
和MAP_SHARED
的命名文件作为您的共享内存。首先用临时名称创建文件,并用它应该包含的初始数据填充它。然后尝试link
它到真名。如果link
由于EEXIST
而失败,那么您不是第一个进程,您可以删除临时文件并打开并映射现有文件。如果link
成功,您是第一个过程。
相关问题
- 1. 如何判断用户是否第一次打开我的应用程序?
- 2. 如何判断用CreateProcess启动的进程是否仍在运行?
- 3. 如何判断pthread_self是否是过程中的主要(第一个)线程?
- 4. 如何判断GIF是否为动画?
- 5. 如何判断表单是否作为子窗口启动
- 6. 如何判断客户端进程是否死亡?
- 7. 如何判断CoInitializeSecurity是否已被调用进程?
- 8. 检查android活动是否是第一次启动
- 9. 如何判断一个函数是否进入内核
- 10. 程序如何判断另一个进程是否作为服务运行?
- 11. 如何判断iPhone应用程序是否通过背景启动
- 12. 如何判断一个git回购是否是一面镜子?
- 13. 如何判断一种语言是否是一见钟情的?
- 14. 如何判断一个函数是否是一个类?
- 15. Android:如何判断一个视图是否在iPhone中滚动
- 16. 如何判断一个动作方法是否有HttpPost attributte?
- 17. 我如何判断一个南希请求是否为移动
- 18. 如何判断某个进程是否在移动设备上运行
- 19. 如何判断一个过程是否已经结束?
- 20. 如何判断soundmanager2是否使用html5?
- 21. 如何判断加载是否有效?
- 22. 如何判断W键是否按下
- 23. 如何判断码头是否冻结?
- 24. 如何判断UITextView是否脏?
- 25. 如何判断AUCTeX是否可用?
- 26. 如何判断UITextField是否为firstResponder
- 27. 如何判断DataRow是否脏
- 28. 如何判断对象是否为空?
- 29. 如何判断MemberInfo是否为内部
- 30. 如何判断NSUserDefaults是否已保存?
您甚至可以在'tmpfs'文件系统中创建指定文件,使其不会触及物理磁盘。 – caf 2012-02-20 00:53:07
是的,POSIX指定了丑陋的'shm_open'接口,而不是用正常的文件系统语义定义'/ dev/shm'实际上令人沮丧。由于无法“重命名”/“链接”共享内存对象,使得它们比其他方式有用得多。 – 2012-02-20 00:57:42
谢谢你的回答。 – 2012-02-22 11:10:21