转自:https://blog.csdn.net/fzubbsc/article/details/37737159
参考:
https://blog.csdn.net/liuxd3000/article/details/17913363
http://blog.chinaunix.net/uid-25845340-id-3017214.html
https://blog.csdn.net/xiao229404041/article/details/7031776
查阅文件:
kernel\linux\linux-4.4.3\kernel\locking\semaphore.c
kernel\linux\linux-4.4.3\include\linux\semaphore.h
DOWN操作:linux内核中,对信号量的DOWN操作有如下几种:
1、void down(struct semaphore *sem); //不可中断
down接口用于请求一个信号量。此函数的调用将会到致调用线程的睡眠, 直到获取到信号。同时,该函数的调用不允许中断。
在此函数中首先进行信号量资源数的查看,如果信号量数据(count)不为0,则把其减1,并返回,调用成功;否则调用__down进行等待,调用者进行睡眠。
2、int down_interruptible(struct semaphore *sem);//可中断
该函数功能和down类似,不同之处为,down不会被信号(signal)打断,但down_