Linux 各類訊號量,Linux訊號量
定義:保護共用資源,使得資源在一個時刻只有一個進程(線程)擁有
原理:訊號量值為正時說明空閑,若為0或負值則說明被佔用
分類:核心訊號量與使用者訊號量,使用者訊號量分為POXIS訊號量和SYSTEMV訊號量,POXIS訊號量分為有名訊號量和無名訊號量
核心訊號量:
- #include<asm/semaphore.h>
- 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 <sys/sem.h>
- 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<semaphore.h>
- 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_post(sem_t *sem);
- int sem_close(sem_t *sem);
- int sem_unlink(const char *name);
- 每個open的位置都要close和unlink,但只有最後執行的unlink生效
參考文獻:http://blog.csdn.net/qinxiongxu/article/details/7830537#comments