linux等待佇列使用案例

2021-10-01 13:06:13 字數 1680 閱讀 9035

struct test_dev;

static ssize_t test_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)

__set_current_state(task_interruptible);

mutex_unlock(&dev->mutex);

schedule();

if(signal_pending(current))

mutex_lock(&dev->mutex);

}if(count>dev->current_len)

count=dev->current_len;

if(copy_to_user(buf,dev->mem,count))else

out:

mutex_unlock(&dev->mutex);

out2:

remove_wait_queue(&dev->r_wait,&wait);

set_current_state(task_running);

return ret;

}static ssize_t test_write(struct file *filp,const char __user *buf,size_t count,loff_t *ppos)

__set_current_state(task_interruptible);

mutex_unlock(&dev->mutex);

schedule();

if(signal_pending(current))

mutex_lock(&dev->mutex);

}if(count>size-dev->current_len)

count=size-dev->current_len;

if(copy_from_user(dev->mem+dev->current_len,buf,count))else

out:

mutex_unlock(&dev->mutex);

out2:

remove_wait_queue(&dev->w_wait,&wait);

set_current_state(task_running);

return ret;

}static int __init test_init(void)

module_init(test_init);

當需要阻塞當前task的時候,先呼叫add_wait_queue把當前task新增到等待佇列,然後呼叫shedule()釋放cpu,需要喚醒的時候呼叫wake_up_interruptible喚醒等待佇列,這樣之前阻塞的task就會重新被排程。

這裡以f2fs的gc執行緒舉例說明。

static int gc_thread_func(void *data)

while (!kthread_should_stop());

return 0;

}int f2fs_start_gc_thread(struct f2fs_sb_info *sbi){…

init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);

linux等待佇列使用步驟

編寫linux驅動程式的乙個問題是 到底如何使用等待佇列呢 等待佇列很容易使用,儘管它的設計很是微妙,但你不需要知道它的內部細節,處理等待佇列的最佳方式就是依照如下操作 1.宣告乙個struct wait queue 變數.你需要為每乙個可以讓程序睡眠的事件預備這樣乙個變數.這就是我建議你放在描述硬...

linux 等待佇列

linux 核心的等待佇列是以雙迴圈鍊錶為基礎資料結構,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。在這個鍊錶中,有兩種資料結構 等待佇列頭 wait queue head t 和等待佇列項 wait queue t 等待佇列頭和等待佇列項中都包含乙個 list head 型別的域...

linux 等待佇列

linux 核心的等待佇列是以雙迴圈鍊錶為基礎資料結構,與程序排程機制緊密結合,能夠用於實現核心的非同步事件通知機制。在這個鍊錶中,有兩種資料結構 等待佇列頭 wait queue head t 和等待佇列項 wait queue t 等待佇列頭和等待佇列項中都包含乙個 list head 型別的域...