我正在使用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. 如何判斷Windows進程是否已啓動
- 2. 如何判斷我的應用程序是否第一次運行?
- 3. 如何判斷用戶是否第一次打開我的應用程序?
- 4. 如何判斷用CreateProcess啓動的進程是否仍在運行?
- 5. Python - 如何判斷一個進程是否受I/O限制?
- 6. 如何判斷子Node.js進程是否來自fork()或不是?
- 7. 如何判斷pthread_self是否是過程中的主要(第一個)線程?
- 8. 如何判斷用戶是第一次運行還是更新應用程序
- 9. 如何判斷GIF是否爲動畫?
- 10. 如何判斷這是用戶的第一次會話? Parse.com(Android)
- 11. 如何判斷表單是否作爲子窗口啓動
- 12. 我該如何判斷Eclipse是否啓動了我的Maven settings.xml
- 13. 如何判斷髮電機是否剛啓動?
- 14. 如何判斷「ZipArchiveEntry」是否是目錄?
- 15. 如何判斷DatagridView的第一個單元是否爲空?
- 16. 如何判斷進程是否在Windows上的Python響應
- 17. 如何判斷客戶端進程是否死亡?
- 18. 如何判斷進程是否未運行?
- 19. 如何判斷CoInitializeSecurity是否已被調用進程?
- 20. 檢查android活動是否是第一次啓動
- 21. 如何判斷一個函數是否進入內核
- 22. 程序如何判斷另一個進程是否作爲服務運行?
- 23. 如何判斷iPhone應用程序是否通過背景啓動
- 24. 如何判斷一個git回購是否是一面鏡子?
- 25. 如何判斷一種語言是否是一見鍾情的?
- 26. 如何判斷一個JSON對象是否是一個數組?
- 27. 如何判斷一個函數是否是一個類?
- 28. 我如何判斷一個南希請求是否爲移動
- 29. Android:如何判斷一個視圖是否在iPhone中滾動
- 30. 如何判斷一個動作方法是否有HttpPost attributte?
您甚至可以在'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