Linux IPC POSIX 信号量
模型
#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 信号量的更多相关文章
- Linux IPC 之信号量
信号量(也叫信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是进程/线程同步的一种方式,有时候我们需要保护一段代码,使它每次只能被一个执行进程/线程运行,这种工作就需 ...
- linux IPC的信号量
信号量相关函数原型 获得一个信号量ID #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h&g ...
- Linux IPC POSIX 消息队列
模型: #include<mqueue.h> #include <sys/stat.h> #include <fcntl.h> mq_open() //创建/获取消 ...
- Linux IPC POSIX 共享内存
模型 #include <unistd.h> //for fstat() #include <sys/types.h> //for fstat() #include <s ...
- Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
Linux进程间通信IPC学习笔记之同步二(Posix 信号量)
- Linux进程同步之POSIX信号量
POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...
- linux Posix 信号量 一
信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...
- Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题
Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...
- linux POSIX 信号量介绍
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...
随机推荐
- jquery中ajax 从前端到后端 完整过程解析
几个原则: 1.get方式访问浏览器时,常加参数缘由: GET访问浏览器是等幂的,就是一个相同的URL只有一个结果[相同是指整个URL字符串完全匹配],所以第二次访问的时候如果 URL字符串没变化,浏 ...
- [moka同学笔记]二、Yii2.0课程笔记(魏曦老师教程)
一.在标签tags的model中 //使用正则表达式,把标签字符串转换成数组 public static function string2array($tags) { return preg_spli ...
- 研究base64_encode的算法
从网上看了一些资料,为了方便自己理解,于是把它的编码原理,自己放在excel表格中清晰列出来,方便以后查阅.做的图如下:
- loadrunner录制回放常见问题及解决办法
1.录制错误 1)录制本机 WebTours 或录制本地网站无法打开 当 使 用 Vista 以 后 的 操 作 系 统 时 , 会 出 现 该 问 题 . 这 是 由 于 在 本 地Wi ...
- GJM : FlatBuffers 与 protobuf 性能比较 [转载 ]
原帖地址:http://blog.csdn.net/menggucaoyuan/article/details/34409433 原作者:企鹅 menggucaoyuan 未经原作者同意不允许转载 ...
- Medoo个人修改版
Medoo是一款轻量级的php数据库操作类,下面不会介绍Medoo的使用方法,想学习Medoo请前往官网自学:http://medoo.in/ 在接触Medoo之前,一直是用自己写的php数据库操作类 ...
- InstantClick – 快速响应!让你的网站与众不同
尽管网络带宽不断增加,但网站并没有更快很多.这是因为最大的瓶颈在于页面加载的延迟.InstantClick 是一个很小的 JavaScript 库,大大加速你的网站响应速度. 在访问者点击一个链接之前 ...
- [deviceone开发]-do_Socket组件示例
一.简介 do_Socket只实现了socket的客户端的功能,这个示例完整了展示了组件的基本用法,需要和sockettest3工具配合使用,sockettest3做为一个socket server来 ...
- JavaScript实战(原生range和自定义特效)
今天我又码了两个特效:一个是用原生input[type=range]的,另一个完全自定义的:下面是完整代码和演示: #tip{ position: absolute; top: 30px; left: ...
- Powershell 学习笔记【持续更新】
1. 判断一个对象是不是空可以用 $null来比较 2. 判断一个字符串是不是空的: [string]::IsNullOrEmpty(...) 3. 在powershell中把结果输出为一个CSV格式 ...