有名訊號量sem_open和記憶體訊號量sem_init建立訊號量的區別
阿新 • • 發佈:2019-02-20
sem_t *sem
sem_open(const char *name, int oflag, .../*mode_t mode,unsinged int value) ;
int sem_init(sem_t *sem,int shared, unsigned int value);
區別:
1.建立有名訊號量必須指定一個與訊號量相關鏈的檔名稱,這個name通常是檔案系統中的某個檔案。
基於記憶體的訊號量不需要指定名稱
2.有名訊號量sem 是由sem_open分配記憶體並初始化成value值
基於記憶體的訊號量是由應用程式分配記憶體,有sem_init初始化成為value值。如果shared為1,則分配的訊號量應該在共享記憶體中。
3.sem_open不需要類似shared的引數,因為有名訊號量總是可以在不同程序間共享的
而基於記憶體的訊號量通過shared引數來決定是程序內還是程序間共享,並且必須指定相應的記憶體
4.基於記憶體的訊號量不使用任何類似於O_CREAT標誌的東西,也就是說,sem_init總是初始化訊號量的值,因此,對於一個給定的訊號量,我們必須小心保證只調用sem_init一次,對於一個已經初始化過的訊號量呼叫sem_init,結果是未定義的。
5.記憶體訊號量通過sem_destroy刪除訊號量,有名訊號量通過sem_unlink刪除
int sem_init(sem_t *sem,int shared, unsigned int value);
區別:
1.建立有名訊號量必須指定一個與訊號量相關鏈的檔名稱,這個name通常是檔案系統中的某個檔案。
基於記憶體的訊號量不需要指定名稱
2.有名訊號量sem 是由sem_open分配記憶體並初始化成value值
基於記憶體的訊號量是由應用程式分配記憶體,有sem_init初始化成為value值。如果shared為1,則分配的訊號量應該在共享記憶體中。
3.sem_open不需要類似shared的引數,因為有名訊號量總是可以在不同程序間共享的
而基於記憶體的訊號量通過shared引數來決定是程序內還是程序間共享,並且必須指定相應的記憶體
4.基於記憶體的訊號量不使用任何類似於O_CREAT標誌的東西,也就是說,sem_init總是初始化訊號量的值,因此,對於一個給定的訊號量,我們必須小心保證只調用sem_init一次,對於一個已經初始化過的訊號量呼叫sem_init,結果是未定義的。
5.記憶體訊號量通過sem_destroy刪除訊號量,有名訊號量通過sem_unlink刪除