首页 > > > Linux信号量-老子今天不干了
今天下班的时候,下起了大雨,7点多的时候大家都躲在办公司等雨停,惊讶的是公司一位同事还去人才公园雨中漫步了一圈才回来。
我想起刚毕业的那几年,工作的激情非常高,学习也像一个无头的小老虎,刚开始接触安卓,很多东西都不懂,那时候,自己写了两个应用,一个叫《地瓜手电筒》,现在搜索还能看到有点下载量,后面还做了一个离线的音乐播放器。那时候刚开始做安卓,没有厉害的师傅带,都是自己摸索,也没有系统的学习,对Git也不熟悉,经常加班到12点,通宵也是正常的事情。
很多时候我们需要自己想要什么,如果觉得这是值得的,就应该去做,如果不值得,那就不要花时间和精力在那上面。
看下面的几张图片就好觉得激情澎湃,那些没有家庭,没有车贷,没有房贷的激情少年们,是多么的放荡不羁......



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

问:什么是信号量?
答:信号量是一个特殊的整数,最大值是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
原文作者:;如有侵权,请联系管理员删除。