Linux POSIX IPC 有名信號量 無名信號量
#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>
//創建/打開一個有名信號量,成功返回新信號量的地址,失敗返回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
value :配合O_CREAT使用,設置信號量的初始值
//初始化無名信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem 創建無名信號量的指針
pthread指定信號量是在線程間使用還是進程間使用
//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] */
};
//歸還信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_post(sem_t *sem);
//獲得信號量sem的當前的值,放到sval中。如果有線程正在block這個信號量,sval可能返回兩個值,0或“-正在block的線程的數目”,Linux返回0
//成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_getvalue(sem_t *sem, int *sval);
//關閉有名信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_close(sem_t *sem);
//試圖銷毀信號量,一旦所有占用該信號量的進程都關閉了該信號量,那麼就會銷毀這個信號量
//成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_unlink(const char *name);
//銷毀信號量,成功返回0,失敗返回-1設errno
//Link with -pthread.
int sem_destroy(sem_t *sem);