歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核下等待隊列的使用

1、wait_queue的使用

需要的頭文件#include<linux/wait.h>

typedef struct __wait_queue wait_queue_t;

struct __wait_queue {

unsigned int flags;

#define WQ_FLAG_EXCLUSIVE 0x01

void *private;

wait_queue_func_t func;

struct list_head task_list;

};

struct __wait_queue_head {

spinlock_t lock;

struct list_head task_list;

};

typedef struct __wait_queue_head wait_queue_head_t;

Static wait_queue_head_t waitq;

用到的函數:

extern void __init_waitqueue_head(wait_queue_head_t *q, struct lock_class_key *);

#define init_waitqueue_head(q) \

do { \

static struct lock_class_key __key; \

\

__init_waitqueue_head((q), &__key); \

} while (0)

用於初始化一個wait_queue_head_t變量

#define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)

#define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL)

喚醒waitq裡的processes,該操作喚醒所有的processes

用於block的函數:

void interruptible_sleep_on(wait_queue_head_t *q);

void sleep_on(wait_queue_head_t *q);

上面兩組中wait_up與wait_up_interruptible()的區別是:

如果你是用 interruptible_sleep_on() 來將 process 放到 wait_queue 時,如果有人送一個 signal 給這個 process,那它就會自動從 wait_queue 中醒來。但是如果你是用 sleep_on() 把 process 放到 wq 中的話,那不管你送任何的 signal 給它,它還是不會理你的。除非你是使用 wake_up() 將它叫醒。sleep 有兩組。wake_up 也有兩組。wake_up_interruptible() 會將 wq 中使用 interruptible_sleep_on() 的 process 叫醒。至於 wake_up() 則是會將 wq 中所有的 process 叫醒。包括使用 interruptible_sleep_on() block的 process。

使用sleep的步驟

Static  wait_queue_head_t waitq;


init_waitqueue_head(&waitq);

wake_up_interruptible(&waitq)

interruptible_sleep_on(&waitq)

注意:以上函數只能在內核層運行,不能在用戶層運行。

Copyright © Linux教程網 All Rights Reserved