模型

#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. 高效 Java Web 开发框架 JessMA v3.2.3 正式发布

    JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hib ...

  2. 网上图书商城2--Category模块

    sql CREATE TABLE `t_category` ( `cid` char(32) NOT NULL, `cname` varchar(50) DEFAULT NULL, `pid` cha ...

  3. .Net中的并行编程-6.常用优化策略

                本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...

  4. 关于WPF中文件夹浏览对话框的方式

    文件夹浏览时dialogresult要写全引用路径 string path=null; FolderBrowserDialog fbd = new FolderBrowserDialog(); fbd ...

  5. SAP 中的用户类型

    在使用 SU01 维护用户时,在登录数据选项卡中会要求选择用户类型,一般我们都选择第一项 Dialog,但是其他几个选项有什么作用呢?下面我们就一一解释. 对话用户顾名思义,就是需要通过 SAP GU ...

  6. word开发遇到的问题

    1.系统不能安装多个office word版本,建议只安装一个2003版本,越完整越好. 2.安装时候ghost系统会遇到问题,由于很多组件没有完整的安装,因此缺少了很多安装时文件保护要进行提醒的dl ...

  7. AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 <?xml vers ...

  8. Powershell 学习笔记【持续更新】

    1. 判断一个对象是不是空可以用 $null来比较 2. 判断一个字符串是不是空的: [string]::IsNullOrEmpty(...) 3. 在powershell中把结果输出为一个CSV格式 ...

  9. FIM2010同步用户

    在需要进行同步的来源MA进行同步 在需要进行导入的来源进行导入

  10. Redis存储Tomcat集群的Session

    Redis存储Tomcat集群的Session 如何 做到把新开发的代码推送到到生产系统中部署,生产系统要能够零宕机.对使用用户零影响. 设想 是使用集群来搞定,通过通知负载均衡Nginx,取下集群中 ...