定義:保護共享資源,使得資源在一個時刻只有一個行程(執行緒)擁有
原理:信號量值為正時說明空閒,若為0或負值則表示被佔用
分類:核心訊號量與使用者訊號量,使用者訊號量分為POXIS訊號量與SYSTEMV訊號量,POXIS訊號量分為有名訊號量與無名訊號量
核心訊號量:
#include
- ##void sema_init(struct semaphore *sem, int val);
- void init_MUTEX(struct semaphore *sem); //初始值1
- void init_MUTEX_LOCKED(struct semaphore *sem); //初始值0
- #void down(struct semaphore *sem); //可睡眠
- int down_interruptible(struct semaphore *sem); //可中斷
- #int down_trylock(struct semaphore *sem); //m非阻塞
- void up(struct semaphore *sem);
#SYSTEMV信號量:
- #include
##int semget(key_t key, int nsems, int oflag); int semop(int semid, struct sembuf *opsptr, size_t nops); int semctl(int semid , int semum, int cmd,...); POSIX無名信號量
#include #sem_t sem; int sem_init(sem_t *sem, int pshared, unsigned int val); //pshared為0則執行緒間共享,pshared為1則父子程序共享 int sem_wait(sem_t *sem); //阻塞-
##int sem_trywait(sem_t *sem); / /非阻塞
-
int sem_post(sem_t *sem);
-
int sem_destroy(sem_t *sem);
-
#進程間共享則sem必須放在共享記憶體區域(mmap, shm_open, shmget),父進程的全域變數、堆疊、堆疊中儲存是不行的
-
POSIX有名信號量
sem_t *sem_open(const char *name, int oflag, mode_t mode, int val);
-
int sem_wait( sem_t *sem);
-
int sem_trywait(sem_t *sem);
int sem_trywait(sem_t *sem); int sem_post(sem_t *sem);-
##int sem_post(sem_t *sem);
-
int sem_close(sem_t *sem);
-
int sem_unlink(const char *name);
#######每個open的位置都要close和unlink,但只有最後執行的unlink生效#########
以上是Linux 各類信號量詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!