ITPub博客

首页 > > > Linux信号量-老子今天不干了

Linux信号量-老子今天不干了

作者:dapan 时间:2018-08-24 10:06:47 0 删除 编辑

01前言

今天下班的时候,下起了大雨,7点多的时候大家都躲在办公司等雨停,惊讶的是公司一位同事还去人才公园雨中漫步了一圈才回来。

我想起刚毕业的那几年,工作的激情非常高,学习也像一个无头的小老虎,刚开始接触安卓,很多东西都不懂,那时候,自己写了两个应用,一个叫《地瓜手电筒》,现在搜索还能看到有点下载量,后面还做了一个离线的音乐播放器。那时候刚开始做安卓,没有厉害的师傅带,都是自己摸索,也没有系统的学习,对Git也不熟悉,经常加班到12点,通宵也是正常的事情。

很多时候我们需要自己想要什么,如果觉得这是值得的,就应该去做,如果不值得,那就不要花时间和精力在那上面。

看下面的几张图片就好觉得激情澎湃,那些没有家庭,没有车贷,没有房贷的激情少年们,是多么的放荡不羁......








看着这么有血性的年轻人,心中一阵陌拜,自己当年怎么就没有勇气甩老板一脸,是为什么?我想了这么多年,真的是因为穷因为穷......



02 正文


问:什么是信号量?

答:信号量是一个特殊的整数,最大值是32767


问:为什么需要信号量?

答:信号量是用来解决线程间同步或互斥的一种机制


举个栗子:

我们把信号量举栗为一个厕所,假设厕所有4个坑,有10个人想上大号,那么有6个人就需要在外面等待。

假设就只有一个坑,有两个人想上厕所,那就有一个人在外面等待,就变成了0,1信号量,相当于互斥锁,我上厕所的时候,你就得等着,你上厕所的时候,我就得等着。


操作相关函数:

创建信号量:

  创建或者打开一个信号量,需要使用sem_open()函数,函数原形如下:

  sem_t sem_open(const char * name, int oflag, mode_t mode, unsigned int value)

  返回值sem_t 是一个结构,如果函数调用成功,则返回指向这个结构的指针,里面装着当前信号量的资源数。

  参数name,就是信号量的名字,两个不同的进程通过同一个名字来进行信号量的传递。

  参数oflag,当他是O_CREAT时,如果name给出的信号量不存在,那么创建,此时必须给出mode和vaule。

  参数mode,指出信号量名字的权限

  参数vaule,信号量的初始值

关闭信号量:

  关闭有名信号量 sem_close(sem_t *sem)

  这个函数只有一个参数,意义也非常明显,就是指信号量的名字。

信号量操作:

  P操作:使用的函数是sem_wait(sem_t *sem)

  如果信号量的值大于零,sem_wait函数将信号量减一,并且立即返回。如果信号量的值小于零,那么该进程会被阻塞在原地。

  V操作:使用的函数是sem_post(sem_t *sem)

  当一个进程使用完某个信号量时,他应该调用sem_post函数来告诉系统收回资源。

  sem_post函数和sem_wait函数的功能刚好相反,他会把指定的信号量加一

删除有名信号量:

  当使用完有名信号后,需要调用函数sem_unlink来释放资源。

  函数原形:int sem_unlink(const char *name)

代码例子:

//进程1
#include 
#include 
#include 
#include 
#include 
#include 

int main()
{
    sem_t *sem_test;

    sem_test = sem_open("sem_test_01", O_CREAT, 0644, 0); 
    if(sem_test < 0)
    {   
          printf("create sem error errno=%d\n",errno);
          exit(-1);
    }   

    printf("process TMAC set to waiting……\n");
    printf("This is 1\n");
    sem_wait(sem_test);
    printf("This is 3\n");
    sem_post(sem_test);
    printf("process TMAC GO OVER \n");
    sem_close(sem_test);
    sem_unlink("sem_test_01");

    return 0;
}

//进程2、
#include
#include
#include
#include
#include
#include


int main()
{
    sem_t *sem_test;

    sem_test = sem_open("sem_test_01",0);

    if(sem_test < 0)
    {
        printf("process Paul creat sem error errno=%d\n",errno);
        exit(-1);
    }

    printf("process Paul 2\n");
    sem_post(sem_test);
    printf("process Paul GO OVER!\n");
    sem_close(sem_test);
    sem_unlink("sem_test_01");
    return 0;
}


编译命令:

gcc -g x -o x.o -lpthread




运行结果:





打印出 This is 1后,进程1阻塞了,他在等待进程2释放信号量,当我们运行完进程2后,进程1能够成功获取信号量,这时候就可以正常运行下去。执行process TMAC GO OVER



​ 微信公众号:嵌入式Linux

求转发

求关注

原文作者:;如有侵权,请联系管理员删除。

上一篇: Hexdump 如何工作
请登录后发表评论 登录
全部评论

注册时间:2020-08-07

  • 博文量
    4504
  • 访问量
    87603