6.7. 快速參考

2018-02-24 15:49 更新

6.7.?快速參考

本章介紹了下面的符號(hào)和頭文件:

#include <linux/ioctl.h>

聲明用來(lái)定義 ioctl 命令的宏定義. 當(dāng)前被 <linux/fs.h> 包含.

_IOC_NRBITS
_IOC_TYPEBITS
_IOC_SIZEBITS
_IOC_DIRBITS

ioctl 命令的不同位段所使用的位數(shù). 還有 4 個(gè)宏來(lái)指定 MASK 和 4 個(gè)指定 SHIFT, 但是它們主要是給內(nèi)部使用. _IOC_SIZEBIT 是一個(gè)要檢查的重要的值, 因?yàn)樗珞w系改變.

_IOC_NONE
_IOC_READ
_IOC_WRITE

"方向"位段可能的值. "read" 和 "write" 是不同的位并且可相或來(lái)指定 read/write. 這些值是基于 0 的.

_IOC(dir,type,nr,size)
_IO(type,nr)
_IOR(type,nr,size)
_IOW(type,nr,size)
_IOWR(type,nr,size)

用來(lái)創(chuàng)建 ioclt 命令的宏定義.

_IOC_DIR(nr)
_IOC_TYPE(nr)
_IOC_NR(nr)
_IOC_SIZE(nr)

用來(lái)解碼一個(gè)命令的宏定義. 特別地, _IOC_TYPE(nr) 是 _IOC_READ 和 _IOC_WRITE 的 OR 結(jié)合.

#include <asm/uaccess.h>
int access_ok(int type, const void *addr, unsigned long size);

檢查一個(gè)用戶空間的指針是可用的. access_ok 返回一個(gè)非零值, 如果應(yīng)當(dāng)允許存取.

VERIFY_READ
VERIFY_WRITE

access_ok 中 type 參數(shù)的可能取值. 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);

用來(lái)存儲(chǔ)或獲取一個(gè)數(shù)據(jù)到或從用戶空間的宏. 傳送的字節(jié)數(shù)依賴 sizeof(*ptr). 常規(guī)的版本調(diào)用 access_ok , 而常規(guī)版本( __put_user 和 __get_user ) 假定 access_ok 已經(jīng)被調(diào)用了.

#include <linux/capability.h>

定義各種 CAP_ 符號(hào), 描述一個(gè)用戶空間進(jìn)程可有的能力.

int capable(int capability);

返回非零值如果進(jìn)程有給定的能力.

#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 等待隊(duì)列的定義類型. 一個(gè) wait_queue_head_t 必須被明確在運(yùn)行時(shí)使用 init_waitqueue_head 或者編譯時(shí)使用 DEVLARE_WAIT_QUEUE_HEAD 進(jìn)行初始化.

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);

使進(jìn)程在給定隊(duì)列上睡眠, 直到給定條件值為真值.

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);

喚醒在隊(duì)列 q 上睡眠的進(jìn)程. _interruptible 的形式只喚醒可中斷的進(jìn)程. 正常地, 只有一個(gè)互斥等待者被喚醒, 但是這個(gè)行為可被 _nr 或者 _all 形式所改變. _sync 版本在返回之前不重新調(diào)度 CPU.

#include <linux/sched.h>
set_current_state(int state);

設(shè)置當(dāng)前進(jìn)程的執(zhí)行狀態(tài). TASK_RUNNING 意味著它已經(jīng)運(yùn)行, 而睡眠狀態(tài)是 TASK_INTERRUPTIBLE 和 TASK_UNINTERRUPTIBLE.

void schedule(void);

選擇一個(gè)可運(yùn)行的進(jìn)程從運(yùn)行隊(duì)列中. 被選中的進(jìn)程可是當(dāng)前進(jìn)程或者另外一個(gè).

typedef struct { /* ... */ } wait_queue_t;
init_waitqueue_entry(wait_queue_t *entry, struct task_struct *task);

wait_queue_t 類型用來(lái)放置一個(gè)進(jìn)程到一個(gè)等待隊(duì)列.

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);

幫忙函數(shù), 可用來(lái)編碼一個(gè)手工睡眠.

void sleep_on(wiat_queue_head_t *queue);
void interruptible_sleep_on(wiat_queue_head_t *queue);

老式的不推薦的函數(shù), 它們無(wú)條件地使當(dāng)前進(jìn)程睡眠.

#include <linux/poll.h>
void poll_wait(struct file *filp, wait_queue_head_t *q, poll_table *p);

將當(dāng)前進(jìn)程放入一個(gè)等待隊(duì)列, 不立刻調(diào)度. 它被設(shè)計(jì)來(lái)被設(shè)備驅(qū)動(dòng)的 poll 方法使用.

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

一個(gè)"幫忙者", 來(lái)實(shí)現(xiàn) fasync 設(shè)備方法. mode 參數(shù)是傳遞給方法的相同的值, 而 fa 指針指向一個(gè)設(shè)備特定的 fasync_struct *.

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

如果這個(gè)驅(qū)動(dòng)支持異步通知, 這個(gè)函數(shù)可用來(lái)發(fā)送一個(gè)信號(hào)到登記在 fa 中的進(jìn)程.

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

nonseekable_open 應(yīng)當(dāng)在任何不支持移位的設(shè)備的 open 方法中被調(diào)用. 這樣的設(shè)備應(yīng)當(dāng)使用 no_llseek 作為它們的 llseek 方法.

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)