在Linux内核中,down, down_interruptible, down_killable, 和 up 是用于操作信号量(semap hores)的函数,它们用于进程同步和互斥。以下是对这些函数的简要说明。
1,down(&sem):
这个函数用于获取信号量。如果信号量的值大于0,它会减少信号量的计数并立即返回。如果信号量的值为0,调用者会被阻塞,直到信号量变为可用或者直到信号量被释放。
2,down_interruptible(&sem):
类似于down,但是它是可中断的。如果信号量的值为0,并且进程收到一个信号(比如用户按下Ctrl+C),down_interruptible会失败并返回-EINTR,而不是一直阻塞。
3,down_killable(&sem):
这个函数在Linux内核2.6.25之后引入,它类似于down_interruptible,但是它只响应致命信号(比如SIGKILL)。如果进程收到一个致命信号,down_killable会失败并返回-EINTR。
4,down_uninterruptible(&sem):
这个函数实际上并不存在标准的Linux内核API中。通常,down函数本身就是不可中断的,除非在特定的情况下,内核代码可能提供了一个自定义的不可中断版本,但这不是标准做法。
5,up(&sem):
这个函数用于释放信号量,增加信号量的计数。如果其他进程或线程正在等待这个信号量,它们中的一个可能会被唤醒。
代码实现
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/semaphore.h>static DECLARE_MUTEX(my_semaphore);
static int __init my_module_init(void)
{
init_MUTEX(&my_semaphore); // 初始化信号量为1
return 0;
}static void __exit my_module_exit(void)
{
up(&my_semaphore); // 释放信号量
}static int my_function(void)
{
if (down_interruptible(&my_semaphore)) {
// 如果信号量获取被中断,处理中断
return -EINTR;
}// 信号量获取成功,执行临界区代码
fun_test();
up(&my_semaphore); // 释放信号量
return 0;
}module_init(my_module_init);
module_exit(my_module_exit);