linux signal up/down/down_interruptiable\down_uninterruptiable使用

在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);

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    陌上花开缓缓归以

    你的鼓励将是我创作的最大动力,

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值