歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux POSIX IPC 有名信號量 無名信號量

Linux POSIX IPC 有名信號量 無名信號量

模型:

  1. 初始化並打開有名信號量: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);
//試圖銷毀信號量,一旦所有占用該信號量的進程都關閉了該信號量,那麼就會銷毀這個信號量
//成功返回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);

Copyright © Linux教程網 All Rights Reserved