一、概念

linux信号量:

  允许多个线程同时进入临界区,可以用于进程间的同步。

和互斥锁(mutex)的区别:

  互斥锁只允许一个线程进入临界区。

所在头文件:

  semaphore.h

二、主要函数

  • 初始化函数

      int sem_init(sem_t *sem, int pshared, unsigned int value)

      sem:要初始化的信号量

      pshared:此信号量是在进程间共享还是线程间共享

      value:信号量的初始值

  • 删除函数

      int sem_destroy(sem_t *sem)

      sem:要销毁的信号量

      注意:只有用sem_init初始化的信号量才能用sem_destroy销毁

  • 等待信号量函数

      int sem_wait(sem_t *sem)

      功能:等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回;

         如果信号量的值为0,则线程阻塞。相当于P操作。

         成功返回0,失败返回-1。

  • 释放信号量

      int sem_post(sem_t *sem)

      功能:释放信号量,让信号量的值加1。相当于V操作。

三、内核编程所用的信号量接口函数

linux内核和应用程序,都会使用信号量,但是它们却用的是不通的函数接口,这里标注一下内核使用的信号量函数接口,一般写驱动的时候会用得到。

  • 初始化函数

      void sema_init(struct semaphore *sem, int val)

         sem:要初始化的信号量

            value:信号量的初始值

init_MUTEX(sem)

功能:定义一个互斥锁,其实该宏的功能,是定义一个初始值为1的信号量。

init_MUTEX_LOCKED(sem)

功能:定义一个互斥锁,一个初始值为0的信号量。

  • 等待信号量函数    

void down(struct semaphore *sem)

      功能:获得信号量,如果信号量的值大于0,将信号量的值减1,立即返回;

         如果信号量的值为0,则进程睡眠,直到该信号量被释放,才能重新得到运行。

int down_interruptible(struct semaphore * sem)

功能:用来获取信号量,如果信号量大于或等于0,获取信号量;

如果信号量不可用,进程将被置为 TASK_INTERRUPTIBLE 类型的睡眠状态,

该函数由返回值来区分是正常返回(重新运行),还是被信号中断返回(重新运行)。

如果返回0,表示获得信号量正常返回;如果被信号打断,返回 -EINTR.

该函数与down()函数的区别在于,down睡眠了之后,只有信号量被释放,才能重新得到运行;

而该函数可以因为其他信号来打断这个睡眠,而得到运行,多了一种获得重新运行的途径。

int down_trylock(struct semaphore * sem)

功能:用来获取信号量,如果信号量大于或等于0,获取信号量,返回值为0;

否则立刻返回,且返回值为1,而不会睡眠。

  • 释放信号量

      void up(struct semaphore *sem)

      功能:释放信号量,让信号量的值加1。

参考资料:Linux线程的信号量同步

linux编程之信号量的更多相关文章

  1. linux编程之信号量编程

    信号量当我们在多用户系统,多进程系统,或是两者混合的系统中使用线程操作编写程序时,我们经常会发现我们有段临界代码,在此处我们需要保证一个进程(或是一个线程的执行)需要排他的访问一个资源.信号量有一个复 ...

  2. 【转载】Linux的进程间通信-信号量

    原文:Linux的进程间通信-信号量 Linux的进程间通信-信号量 版权声明: 本文章内容在非商业使用前提下可无需授权任意转载.发布. 转载.发布请务必注明作者和其微博.微信公众号地址,以便读者询问 ...

  3. linux编程基础汇总贴

    linux编程基础汇总贴http://newzol.cn/forum.php?mod=viewthread&tid=67&fromuid=3(出处: newzol) 1.管道 http ...

  4. linux 下的信号量参数

    linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...

  5. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结 转载

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  6. 【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会 ...

  7. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  8. 【Linux】Semaphore信号量线程同步的例子

    0. 信号量 Linux下的信号量和windows下的信号量稍有不同. Windows Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同.  而且Windows下的信号量是一个 ...

  9. linux编程获取本机网络相关参数

    getifaddrs()和struct ifaddrs的使用,获取本机IP 博客分类: Linux C编程   ifaddrs结构体定义如下: struct ifaddrs { struct ifad ...

随机推荐

  1. 一次关于()=>({})的使用

    今天遇到了一个问题,值得一记 首先在我看项目代码时发现了一个问题 有一个JS的export如下 大家可以注意一下config 这里为什么要如此写法呢? 首先这里用的时ES6的箭头函数 ()=>{ ...

  2. 【代码笔记】Web-HTML-CSS

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  3. 【读书笔记】iOS-解析XML

    使用最广泛的解析XML文档的方法有两种,一种基于SAX,另一种基于DOM.SAX解析器是事件驱动型的,在解析时增量地读取XML文档,当解析器识别出一个结点的时候会调用相应的委托方法. 参考资料< ...

  4. 6个顶级Python NLP库的比较!

    6个顶级Python NLP库的比较! http://blog.itpub.net/31509949/viewspace-2212320/ 自然语言处理(NLP)如今越来越流行,在深度学习开发的背景下 ...

  5. 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析

    今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...

  6. CentOS7:解决Packagekit占用yum问题

    首先: vim /etc/yum/pluginconf.d/langpacks.conf 将第一行:enable=1改为enable=0   然后执行一下yum命令,发现还会占用,杀死线程即可.

  7. 记一次nginx php配置的心路历程

    1.本来搞好了php的配置,想把目录下移一层 从 www.abc.com 变成 www.abc.com/wxapi ,由于我的真实文件目录比路由少了一层public 尝试了很多办法都不行 甚至想到了u ...

  8. Ubuntu16下配置支持Windows访问的samba共享

    一.安装Ubuntu samba服务器 $ sudo apt-get install samba $ sudo apt-get install smbclient # Linux客户端测试用 二.创建 ...

  9. CENTOS7 SYSTEMD SERVICE 将自己的程序放入自动启动的系统服务

    1. 进入文件夹cd /usr/lib/systemd/system 2. 创建文件somed.service 3. 输入内容.如果是监控类程序,需要输入Type=forking[Unit]Descr ...

  10. 浅谈sql server聚集索引与非聚集索引

    今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...