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 型別的域...