<p>Hi, everyone</p><p>I am implementing a simple driver to experiment with wait queue.Two or more read processes block until a write process changes a flag and call <span style="background-color: rgb(214, 212, 213);">wake_up_interruptible()</span>.I expect that a write process will only wake up one read process.However, once a write process calls &nbsp;<span style="background-color: rgb(214, 212, 213);">wake_up_interruptible()</span><span style="background-color: rgb(255, 255, 255);">&nbsp;, all the read processes are awaken.&nbsp;</span>How can I wake up one process from the wait queue? Here is the snippet of the simple dirver(just for experimenting, kernel 2.6.18):</p><p><br></p><p><font size="2" style="background-color: rgb(255, 255, 255);">static ssize_t rlwait_read(struct file *filp, char __user *userp, size_t size, loff_t *off)</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">{</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; struct rlwait_t *rock = (struct rlwait_t *)filp-&gt;private_data;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; DECLARE_WAITQUEUE(wait, current);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; add_wait_queue(&amp;rock-&gt;r_wait_head, &amp;wait);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; while (rock-&gt;r_flag == 0) {</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp; set_current_state(TASK_INTERRUPTIBLE);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp; schedule();</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; } &nbsp;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);"><br></font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; remove_wait_queue(&amp;rock-&gt;r_wait_head, &amp;wait);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; set_current_state(TASK_RUNNING);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; return 0;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">}</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);"><br></font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">static ssize_t rlwait_write(struct file *filp, const char __user *userp, size_t size, loff_t *off)</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">{</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; struct rlwait_t *rock = (struct rlwait_t *)filp-&gt;private_data;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; rock-&gt;r_flag = 1;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; wake_up_interruptible(&amp;rock-&gt;r_wait_head);</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">&nbsp; &nbsp; return size;&nbsp;</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);">}</font></p><p><font size="2" style="background-color: rgb(255, 255, 255);"><br></font></p><p><font size="2">Thans in advice.</font></p>