模型

#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>
sem_open() //初始化并打开有名信号量
sem_init() //创建/获得无名信号量
sem_wait()/sem_trywait()/sem_timedwait()/sem_post()/sem_getvalue() //操作信号量
sem_close() //退出有名信号量
sem_unlink() //销毁有名信号量
sem_destroy() //销毁无名信号量

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);

sem_unlink()

//试图销毁信号量,一旦所有占用该信号量的进程都关闭了该信号量,那么就会销毁这个信号量
//成功返回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);

Linux IPC POSIX 信号量的更多相关文章

  1. Linux IPC 之信号量

    信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...

  2. linux IPC的信号量

    信号量相关函数原型 获得一个信号量ID #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h&g ...

  3. Linux IPC POSIX 消息队列

    模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...

  4. Linux IPC POSIX 共享内存

    模型 #include <unistd.h> //for fstat() #include <sys/types.h> //for fstat() #include <s ...

  5. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  6. Linux进程同步之POSIX信号量

    POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...

  7. linux Posix 信号量 一

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...

  8. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

  9. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

随机推荐

  1. python 三级菜单

    三级列表: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家':{}, ...

  2. Java的自动递增和递减

    和C 类似,Java 提供了丰富的快捷运算方式.这些快捷运算可使代码更清爽,更易录入,也更易读者辨读.两种很不错的快捷运算方式是递增和递减运算符(常称作"自动递增"和"自 ...

  3. 【转】定时自动启动任务crontab命令用法

    每个操作系统都有它的自动定时启动程序的功能,Windows有它的任务计划,而Linux对应的功能是crontab. crontab简介 crontab命令常见于Unix和类Unix的操作系统之中,用于 ...

  4. 一些ajax代码

    $.ajax({ type : "get", url : "list_hot_ajax.json", data : {"provinceId" ...

  5. transform:rotate在手机上显示有锯齿的解决方案大全

    先来个兼容性说明,洗洗脑: div{transform:rotate(7deg);-ms-transform:rotate(7deg); /* IE 9 */-moz-transform:rotate ...

  6. jQuery的eq方法

    定义和用法eq() 方法将匹配元素集缩减值指定 index 上的一个. 语法.eq(index) 其中的index :整数,指示元素的位置(最小为 0).如果是负数,则从集合中的最后一个元素往回计数. ...

  7. URI、URL、URN介绍

    注:1. 仅从http(Hypertext Transfer Portocol)角度阐述,不涉及语言层面的类库. 2. 以下内容均参考<Http权威指南>一书. 一.万维网构成       ...

  8. ios线程和GCD

    1.什么是进程? 进程是指在系统中正在运行的一个应用程序.比如同时打开QQ.Xcode,系统就会分别启动2个进程.截图 2.什么是线程? 1).一个进程要想执行任务,必须得有线程(每一个进程至少要有一 ...

  9. markdown 使用

    一:markdown编辑器下载 小书匠 http://soft.xiaoshujiang.com/ 在线编辑工具,所写即所见 作业部落 https://www.zybuluo.com/mdeditor ...

  10. Android 手机卫士--自定义控件(获取焦点的TextView)

    本文地址:http://www.cnblogs.com/wuyudong/p/5906735.html,转载请注明源地址. 本文将实现标题栏下面的textview中的文字跑马灯的效果,就是将一行文字水 ...