DESCRIPTION

POSIX 信号量允许进程间和线程间同步他们的操作. 一个信号量是一个整型(integer),其值不能小于0. 信号量允许2中操作:给信号量的值加1(sem_post); 给信号量的值减一(sem_wait).

如果信号量的值为0, 那么sem_wait() 函数将会阻塞, 直到信号量的值大于0才会解除阻塞. POSIX 信号量有两种形式: 有名信号量 和 无名信号量.

Named semaphores

一个有名信号量有一个唯一的名字, 名字的格式是 /somename; 名字是以NULL结尾的字符串,最大长度不超过NAME_MAX-4 (减4的原因见Accessing named semaphores via the filesystem) 个字节(包括最前面的斜线),

除了首个字节是斜线外,之后的任何字节都不能是斜线.

两个进程可以通过给 sem_open()函数传递相同名字来达到操作同一个信号量的目的.

函数sem_open() 可以创建一个新的有名的信号量 或者 打开一个既存的有名信号量. 信号量被打开后, 就可以使用函数 sem_post() sem_wait() 来操作它.

当一个进程使用完了这个信号量后,他可以使用函数 sem_close() 来关闭这个信号量.

当所有的进程都不再使用这个信号量时,可以调用函数 sem_unlink() 将这个信号量从系统中删除.

Unnamed semaphores (memory-based semaphores)

无名信号量没有名字, 作为代替有名的方法,无名信号量被放置于一个多线程共享的内存区域中(线程共享的信号量) 或者多个进程共享的内存区域中(进程共享的信号量).

线程共享的信号量被放置于一个进程之内的多线程共享内存区,例如全局变量.

进程共享信号量必须被放置于共享内存中(例如使用shm_open()创建的共享内存对象).

在使用无名信号量之前, 必须使用函数 sem_init() 初始化这个无名信号量, 随后才可以使用 sem_post() sem_wait() 来操作这个无名信号量.

当无名信号量不在使用时, 并且信号量所在的内存区域没有被释放, 使用 sem_destroy() 来删除这个无名信号量.

Versions

在linux内核2.6版本之前, Linux只支持无名,线程共享的信号量. 从Linux 内核 2.6版本起 ,glibc提供了NPTL线程实现, 完整的POSXI信号量被提供了.

Persistence(持续性)

信号量是随内核持续的: 如果不调用sem_unlink进行删除, 信号量会一直持续到系统关闭.

Linking

编译时需要链接pthread库.

Accessing named semaphores via the filesystem

在Linux上, 有名信号量时在虚拟文件系统中创建的, 通常挂载在目录 /dev/shm 下, 名字的形式是 sem.somename (信号量名字长度是 NAME_MAX-4 的原因)。

从Linux内核2.6.19版本起, Linux支持使用访问控制列表(ACLs) 来控制虚拟文件系统中对象的权限.

Inherit

CONFORMING TO

POSIX.1-2001.

NOTES

System V 的信号量是过时的, POSIX信号量提供了使用更简单、设计更合理的API.

API List

POSIX信号量的更多相关文章

  1. 第10章 Posix 信号量

    10.1 概述 10.1.1 信号量类型 Posix有名信号量:使用Posix IPC名字,可用于进程或线程间同步: Posix基于内存的信号量:也叫做无名信号量,存放在共享内存中,可用于进程或线程间 ...

  2. 进程间通信之POSIX信号量

    POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...

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

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

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

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

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

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

  6. linux POSIX 信号量介绍

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

  7. posix信号量与互斥锁

    1.简介 POSIX信号量是一个sem_t 类型的变量,但POSIX 有两种信号量的实现机制:无名信号量和命名信号量.无名信号量可以用在共享内存的情况下, 比如实现进程中各个线程之间的互斥和同步.命名 ...

  8. linux Posix 信号量 二

    一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共 ...

  9. linux Posix 信号量 一

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

随机推荐

  1. 超越村后端开发(5:远程同步本地与服务器端的MySQL数据库)

    1.同步MySQL数据库 服务器选用的华为云,安装了Ubuntu18.04,华为云默认是以root用户登录的. 1.使用Xshell6连接华为云 ls 2.Ubuntu18.04安装MySQL5.7 ...

  2. docker容器网络

    1.我们在使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式: · host模式,使用--net=host指定 · containe ...

  3. (转) qt: usb热插拔(linux);

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

  4. 享元模式-Flyweight(Java实现)

    享元模式-Flyweight 享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. 本文中的例子如下: 使用享元模式: 小明想看编程技术的书, ...

  5. vue项目打包笔记

    我的需求是在同一个代码目录下,可以同时放入两个项目包,通过运行不同的命令,运行相应的项目页面以及打包相应的项目. 这样的话,代码管理比较方便,用于多个项目在同一时间开发,类型一样,但在功能上有所区分的 ...

  6. C++自己实现一个String类

    C++自己实现一个String类(构造函数.拷贝构造函数.析构函数和字符串赋值函数) #include <iostream> #include <cstring> using ...

  7. win10下安装Cygwin配置gcc编译环境

    首先要说明的是,我个人安装cygwin的用途是为了使用kenlm工具训练通及语言模型. 注:统计语言模型工具有比较多的选择,目前比较好的有srilm以及kenlm,其中kenlm比srilm晚出来,训 ...

  8. 微信小程序开发之自定义菜单tabbar

    做这个 遇到问题比较多,特此记录以便查看,直接上代码: 一.app.js 控制原有菜单隐藏.启用新菜单.菜单列表,集中在这里控制 hideTabBar这个很关键,解决苹果6S导致的双导航栏:原文htt ...

  9. Mybatis 笔记

    环境:Mybatis 3 +MariaDB 10.1 似乎在调用存储过程时 ,参数只能写在一行上. 否则会返回语法错误.

  10. GitLab实战操作指南

    一.Git原理 1.Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). 2.Git有什么特点? 简单来说就是:高端大气上档次! 3.GIt与SVN区别 SVN管理: 属于集中式 ...