模型: 1. 初始化並打開有名信號量:sem_open() 創建/獲得無名信號量:sem_init() 操作信號量:sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue() 退出有名信號量:sem_close() 銷毀有名信 ...
模型:
- 初始化並打開有名信號量:sem_open()
- 創建/獲得無名信號量:sem_init()
- 操作信號量:sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue()
- 退出有名信號量:sem_close()
- 銷毀有名信號量:sem_unlink()
- 銷毀無名信號量:sem_destroy()
頭文件
#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>
sem_open()
//創建/打開一個有名信號量,成功返回新信號量的地址,失敗返回SEM_FAILED設errno
// <semaphore.h>
//#define SEM_FAILED ((sem_t *) 0
//#define SEM_VALUE_MAX (2147483647)
//Link with -pthread.
sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
oflag
- O_CREAT如果信號量不存在就創建信號量,信號量的UID被設為調用進程的effective UID,GID被設為調用程式的GID,可以在mode指定許可權
- O_EXCL和O_CREAT連用,確保可以創建新的信號量,如果已存在就報錯
value :配合O_CREAT使用,設置信號量的初始值
sem_init()
//初始化無名信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem 創建無名信號量的指針
pthread指定信號量是線上程間使用還是進程間使用
- 0表示信號量在一個進程內的線程間使用,此時信號量應該分配的線上程可見的記憶體區域(eg,全局區,BSS段,堆區)
- 非0表示信號量在進程間使用,此時信號量應該分配在共用記憶體里,If pshared !=0,
sem_wait()/sem_trywait()/sem_timedwait()
//Link with -pthread.
//成功返回降低後的信號量的值,失敗返回-1設errno
//試圖占用信號量,如果信號量值>0,就-1,如果已經=0,就block,直到>0
int sem_wait(sem_t *sem);
//試圖占用信號量,如果信號量已經=0,立即報錯
int sem_trywait(sem_t *sem);
//試圖占用信號量
//如果信號量=0,就block abs_timeout那麼久,從 Epoch, 1970-01-01 00:00:00 +0000 (UTC).開始按納秒計
//如果時間到了信號量還沒>0,報錯
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
struct timespec {
time_t tv_sec; /* Seconds */
long tv_nsec; /* Nanoseconds [0 .. 999999999] */
};
sem_post()
//歸還信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_post(sem_t *sem);
sem_getvalue()
//獲得信號量sem的當前的值,放到sval中。如果有線程正在block這個信號量,sval可能返回兩個值,0或“-正在block的線程的數目”,Linux返回0
//成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_getvalue(sem_t *sem, int *sval);
sem_close()
//關閉有名信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_close(sem_t *sem);
sem_unlink()
//試圖銷毀信號量,一旦所有占用該信號量的進程都關閉了該信號量,那麼就會銷毀這個信號量
//成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_unlink(const char *name);
sem_destroy()
//銷毀信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_destroy(sem_t *sem);