2017-04-04 73 views
0

什麼我目前工作的要求夫婦POSIX信號到多個進程將運行在函數中被初始化,並且信號燈將與這些加工也將運行的另一個功能共享。我該如何解決這個問題,以便信號量只能由一個線程創建,而其餘的只能打開它們?我似乎無法找到任何有關如何在任何地方做到這一點。如何只初始化信號燈一次?

所有我能找到關於這個問題是關於如何使用sem_wait()和sem_post()函數,但沒有具體到我的問題。我還必須確保一個文件只創建一次並由其他進程打開,但可以檢查該文件是否已由access()函數創建。有沒有類似的信號量?

在解釋如何做到這一點,將不勝感激任何幫助。

+1

開始之前線程之外創建它們。 – Fredrik

回答

0

文件可以被檢查是否它已經被訪問()函數

它只會出現,它可以使檢查已經創建。實際上這是行不通的。

在您通過調用access()並且在嘗試自己創建它之前驗證它不存在時,可以創建另一個執行線程的文件。這被稱爲競賽條件

這就是爲什麼使用在opensem_open系統調用O_EXCL | O_CREAT標誌。此操作原子:它驗證文件/信號燈不存在,並創建一個新的,在一個不可分割的動作。如果操作返回失敗並且errno設置爲EEXIST,則文件/信號量已經存在。

這自然僅適用於命名信號(那些你sem_open創建)。應該在開始使用它的線程之前創建一個未命名的信號量(您創建的一個信號量爲sem_init),或者使用其他方法同步其創建。