2012-02-19 97 views
3

我正在使用C編寫的程序,即某些進程需要訪問嵌入式Linux上的共享內存。這個共享內存需要在創建時進行初始化。附加到此內存的任何進程可能會崩潰。當它重新啓動時(可能由linux INIT),它不能再次初始化共享內存,因爲其他進程正在使用它。如何判斷當前正在創建共享內存的進程是第一次啓動還是重新啓動。我想出了一個想法,它在共享內存中分配一個整數,寫入一個數字,如5678956(除ffffffff或00000000之外的任何數字),以聲明此內存已被初始化。但是我不確定這是否正常工作,因爲關鍵數據是存儲這些內存。任何意見,將不勝感激。謝謝。如何判斷是否是第一次啓動進程

回答

4

您應該同時使用共享信號量和共享內存段。嘗試使用sem_open使用O_EXCL|O_CREAT和初始值0打開信號量。如果成功,則創建並初始化共享內存段,然後發佈信號並將其關閉。如果在排他模式下打開seamphore失敗,打開它非獨佔並等待信號量,然後關閉它。

另一種解決方案,如果您願意:在文件系統中使用mmapMAP_SHARED的命名文件作爲您的共享內存。首先用臨時名稱創建文件,並用它應該包含的初始數據填充它。然後嘗試link它到真名。如果link由於EEXIST而失敗,那麼您不是第一個進程,您可以刪除臨時文件並打開並映射現有文件。如果link成功,您是第一個過程。

+0

您甚至可以在'tmpfs'文件系統中創建指定文件,使其不會觸及物理磁盤。 – caf 2012-02-20 00:53:07

+0

是的,POSIX指定了醜陋的'shm_open'接口,而不是用正常的文件系統語義定義'/ dev/shm'實際上令人沮喪。由於無法「重命名」/「鏈接」共享內存對象,使得它們比其他方式有用得多。 – 2012-02-20 00:57:42

+0

謝謝你的回答。 – 2012-02-22 11:10:21

相關問題