一、概念

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. Python 解决Python安装包时提示Unable to find vcvarsall.bat的问题

    解决Python安装包时提示Unable to find vcvarsall.bat的问题   by:授客 QQ:1033553122 问题 Python安装包时,提示Unable to find v ...

  2. selenium win7+selenium2.0+python环境搭建

    win7+selenium2.0+python环境搭建 by:授客 QQ:1033553122 步骤1:下载python 担心最新版的支持不太好,这里我下载的是python 2.7(selenium之 ...

  3. Flutter 布局(七)- Row、Column详解

    本文主要介绍Flutter布局中的Row.Column控件,详细介绍了其布局行为以及使用场景,并对源码进行了分析. 1. Row A widget that displays its children ...

  4. Android View体系(八)从源码解析View的layout和draw流程

    前言 上一篇文章我们讲了View的measure的流程,接下来我们讲下View的layout和draw流程,如果你理解了View的measure的流程,那这篇文章自然就不在话下了. 1.View的la ...

  5. LeetCode题解之Second Minimum Node In a Binary Tree

    1.题目描述 2.问题分析 使用set. 3.代码 set<int> s; int findSecondMinimumValue(TreeNode* root) { dfs(root); ...

  6. 【第四篇】SAP ABAP7.5x新语法之CREATE DATA&INTERFACE

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文地址:SAP ABAP7.5x系列之CREATE DA ...

  7. Postgresql_根据执行计划优化SQL

    执行计划路径选择 postgresql查询规划过程中,查询请求的不同执行方案是通过建立不同的路径来表达的,在生成许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行 ...

  8. zabbix-Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused

    监控zabbix服务端这台服务器,然后显示Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Conne ...

  9. kettle 合并记录步骤中的 关键字段和 比较字段的说明

    该步骤用于将两个不同来源的数据合并,这两个来源的数据分别为旧数据和新数据,该步骤将旧数据和新数据按照指定的关键字匹配.比较.合并. 需要设置的参数: 旧数据来源:旧数据来源的步骤 新数据来源.新数据来 ...

  10. java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.demoDao.getXXX;

    java.lang.RuntimeException: org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...