小编Lau*_*Man的帖子

C - Linux内核:关闭两个kthreads冻结机器

编辑:我解决了这个问题.我明天再次上班时会立即添加自己的答案/解决方案.


我正在为Linux内核3.16.x开发内核模块.我的模块应该接收和发送以太网帧,所以我创建了两个线程.一个用于接收部分,一个用于发送部分.它工作正常.

当我尝试关闭模块的设备文件并卸载它时出现我的问题.确切地说,它在尝试杀死我的线程时发生.机器(我在虚拟机上测试,使用Ubuntu 14.04)在任何输出之前冻结.但是,当我从代码中删除"线程杀死部分"时,它不再冻结.这就是为什么我很确定,这个问题源于我处理kthreads杀戮的方式.

这是我的两个主题:

TX THREAD:信号量tx_sem在代码的另一部分中被提升.

static int tx_task(void *par)
{
    device->tx_task_running = 1;

    allow_signal(SIGTERM);
    while (!signal_pending(current) && device->tx_task_running) {
        /* wait until there is something to send */
        down_interruptible(&device->tx_sem);

        if (signal_pending(current)) {
            PRINTD("device_TX_task(): Received kill signal\n");
            break;
        }

        /* check if device is still initialized before continuing*/
        if (!device->init_flag) {
            break;
        }
    }
    device->tx_task_running = 0;
    return DEVICE_RET_OK;
}
Run Code Online (Sandbox Code Playgroud)

RX THREAD

static int device_rx_task(void *par)
{
    device->rx_task_running = 1;

    /* task loop */
    allow_signal(SIGTERM);
    while …
Run Code Online (Sandbox Code Playgroud)

c multithreading freeze linux-kernel

5
推荐指数
1
解决办法
325
查看次数

标签 统计

c ×1

freeze ×1

linux-kernel ×1

multithreading ×1