首頁  >  文章  >  運維  >  Linux 各類信號量詳解

Linux 各類信號量詳解

PHP中文网
PHP中文网原創
2017-06-21 13:58:513635瀏覽

定義:保護共享資源,使得資源在一個時刻只有一個行程(執行緒)擁有

原理:信號量值為正時說明空閒,若為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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn