UNP(卷2:進程間通信)—— 第10章:Posix信號量


sem_open、sem_close、sem_unlink

#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <semaphore.h>

sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
                                                                               // 返回:成功爲指向信號量的指針,出錯爲SEM_FAILED

int sem_close(sem_t *sem);

int sem_unlink(const char *name);

Link with -pthread.

函數sem_open創建一個新的有名信號量或打開一個已存在的有名信號量。有名信號量總是既可用於線程間的同步,又可用於進程間的同步。

         oflag: 0, O_CREAT, O_EXCL

         mode: 權限位

         value:信號量的初始值,不能超過SEM_VALUE_MAX。

          如果指定了O_CREAT,那麼第三個和第四個參數是需要的。

使用sem_close關閉有名信號量,但並不將它從系統刪除。

使用sem_unlink從系統中刪除有名信號量。

一個進程終止時,內核還對其上仍然打開着的所有有名信號量自動執行這樣的信號量關閉操作。不論該進程是自願終止的(通過調用exit或_exit)還是非自願的(通過向它發送信號),這種自動關閉都會發生。

每個信號量有一個引用計數器記錄當前的打開次數,sem_unlink 類似 unlink 函數:當引用計數大於0時,name就能從文件系統中刪除,然而其信號量的析構卻要等到最後一個sem_close發生時爲止


sem_wait、sem_trywait

#include <semaphore.h>

int sem_wait(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

Link with -pthread.

sem_wait函數測試所指定的信號量的值,如果該值大於0,那就將它減1並立即返回。如果該值等於0,調用線程就被投入睡眠中,知道該值變爲大於0,這時再將它減 1,函數隨後返回“測試並減 1” 操作必須是原子的。如果被某個信號中斷,sem_wait 可能過早返回,錯誤爲EINTR。

sem_trywait , 當信號值已經是0 時,它返回一個EAGAIN錯誤


sem_post、sem_getvalue

#include <semaphore.h>

int sem_post(sem_t *sem);

int sem_getvalue(sem_t *sem, int *sval);
                                          // 返回:若成功則爲0,出錯則爲-1
當一個線程使用完某個信號量,它應該調用sem_post。本函數把所指定的信號量的值加 1, 然後喚醒正在等待該信號量值變成正數的任意線程。

sem_getvalue 返回所指定信號量的當前值。如果該信號量當前已上鎖,那麼返回值或爲0,或爲某個負數,其絕對值就是等待該信號量解鎖的線程數。


sem_init、sem_destroy

此前處理的是有名信號量,這些信號量由一個name參數標識,代指文件系統中的某個文件。POSIX也提供基於內存的信號量。它們由應用程序分配信號量的內存空間,然後由系統初始化它們的值。

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

int sem_destroy(sem_t *sem);
如果pshared 爲0,那麼待初始化的信號量是在同一進程的各個線程間共享的。否則該信號量是在進程間共享的。

當pshared 非 0 時,該信號量必須存放在某種類型的共享內存區,使用它的所有進程都要能訪問該共享內存區

信號量限制

SEM_NSEMS_MAX: 一個進程可同時打開着的最大信號量數。

SEM_VALUE_MAX: 一個信號量的最大值。

在<unistd.h>中定義。
















發佈了98 篇原創文章 · 獲贊 74 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章