Краткая справка

Предыдущая  Содержание  Следующая V*D*V

Эта глава представляет следующие символы и заголовочные файлы:

 

#include <linux/ioctl.h>

Объявляет все макросы, которые используются для определения команд ioctl. В настоящее время он подключается с помощью <linux/fs.h>.

_IOC_NRBITS

_IOC_TYPEBITS

_IOC_SIZEBITS

_IOC_DIRBITS

Число бит, доступное для различных битовых полей команд ioctl. Есть также ещё четыре макроса, которые определяют MASKи и четыре, определяющие SHIFTы, но они в основном для внутреннего пользования. _IOC_SIZEBITS является важным значением для проверки, так как оно меняется в зависимости от архитектуры.

_IOC_NONE

_IOC_READ

_IOC_WRITE

Возможные значения битового поля "направление". "Чтение" и "Запись" являются разными битами и могут быть сложены командой OR (ИЛИ) для указания чтения/записи. Значения базируются на 0.

_IOC(dir,type,nr,size)

_IO(type,nr)

_IOR(type,nr,size)

_IOW(type,nr,size)

_IOWR(type,nr,size)

Макросы, используемые для создания команд ioctl.

_IOC_DIR(nr)

_IOC_TYPE(nr)

_IOC_NR(nr)

_IOC_SIZE(nr)

Макросы, которые используются для декодирования команд. В частности, _IOC_TYPE(nr) является комбинацией по ИЛИ для _IOC_READ и _IOC_WRITE.

 

#include <asm/uaccess.h>

int access_ok(int type, const void *addr, unsigned long size);

Проверяет, что указатель в пользовательском пространстве является верным. access_ok возвращает ненулевое значение, если доступ будет разрешён.

VERIFY_READ

VERIFY_WRITE

Возможные значения аргумента type в access_ok. VERIFY_WRITE является надстройкой VERIFY_READ.

 

#include <asm/uaccess.h>

int put_user(datum,ptr);

int get_user(local,ptr);

int __put_user(datum,ptr);

int __get_user(local,ptr);

Макросы, которые используются для хранения и получения данных в или из пространства пользователя. Передаваемое количество байт зависит от sizeof(*ptr). Обычные версии сначала вызывают access_ok, в то время как специальные версии (__put_user и __get_user) предполагают, что access_ok уже вызывалась

 

#include <linux/capability.h>

Определяет различные символы CAP_, описывающие какие возможности доступа может иметь процесс пользовательского пространства.

int capable(int capability);

Возвращает ненулевое значение, если этот процесс имеет данное разрешение.

 

#include <linux/wait.h>

typedef struct { /* ... */ } wait_queue_head_t;

void init_waitqueue_head(wait_queue_head_t *queue);

DECLARE_WAIT_QUEUE_HEAD(queue);

Определяет тип для очереди ожидания Linux. wait_queue_head_t должен быть явно проинициализирован либо init_waitqueue_head во время выполнения, либо DECLARE_WAIT_QUEUE_HEAD во время компиляции.

void wait_event(wait_queue_head_t q, int condition);

int wait_event_interruptible(wait_queue_head_t q, int condition);

int wait_event_timeout(wait_queue_head_t q, int condition, int time);

int wait_event_interruptible_timeout(wait_queue_head_t q, int condition, int time);

Помещает процесс в сон в данной очереди, пока данное condition (условие) оценивается как истинное значение.

void wake_up(struct wait_queue *q);

void wake_up_interruptible(struct wait_queue *q);

void wake_up_nr(struct wait_queue *q, int nr);

void wake_up_interruptible_nr(struct wait_queue *q, int nr);

void wake_up_all(struct wait_queue *q);

void wake_up_interruptible_all(struct wait_queue *q);

void wake_up_interruptible_sync(struct wait_queue *q);

Пробуждает процессы, которые являются спящими в очереди q. Форма _interruptible пробуждает только прерываемые процессы. Как правило, пробуждается только один ожидающий эксклюзивно, но это поведение можно изменить с помощью форм _nr или _all. Версия _sync не переключает процессор перед возвратом.

 

#include <linux/sched.h>

set_current_state(int state);

Устанавливает состояние выполнения для текущего процесса. TASK_RUNNING означает, что он готов к запуску, а состояниями сна являются TASK_INTERRUPTIBLE и TASK_UNINTERRUPTIBLE.

void schedule(void);

Выбирает работающий процесс из очереди выполнения. Выбранный процесс может быть current (текущим) или любым другим.

typedef struct { /* ... */ } wait_queue_t;

init_waitqueue_entry(wait_queue_t *entry, struct task_struct *task);

Тип wait_queue_t используется для помещения процесса в очередь ожидания.

void prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state);

void prepare_to_wait_exclusive(wait_queue_head_t *queue, wait_queue_t *wait, int state);

void finish_wait(wait_queue_head_t *queue, wait_queue_t *wait);

Вспомогательные функции, которые могут быть использованы в коде для ручного управления сном.

void sleep_on(wiat_queue_head_t *queue);

void interruptible_sleep_on(wiat_queue_head_t *queue);

Устаревшие и осуждаемые для использования функции, которые безоговорочно помещают текущий процесс в сон.

 

#include <linux/poll.h>

void poll_wait(struct file *filp, wait_queue_head_t *q, poll_table *p)

Помещает текущий процесс в очередь ожидания сразу, без планировщика. Предназначена для использования методом poll драйверами устройств.

int fasync_helper(struct inode *inode, struct file *filp, int mode, struct fasync_struct **fa);

"Помощник" для реализации метода устройства fasync. Аргумент mode является тем же значением, которое передаётся в метод, а fa указывает на зависимую от устройства fasync_struct *.

void kill_fasync(struct fasync_struct *fa, int sig, int band);

Если драйвер поддерживает асинхронное уведомление, эта функция может быть использована для отправки сигнала процессам, зарегистрированным в fa.

int nonseekable_open(struct inode *inode, struct file *filp);

loff_t no_llseek(struct file *file, loff_t offset, int whence);

nonseekable_open должна быть вызвана в методе open любого устройства, которое не поддерживает произвольный доступ. Такие устройства должны также использовать no_llseek как свой метод llseek.

 

Предыдущая  Содержание  Следующая