W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
本章介紹了下面的符號(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 方法.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: