?? ioctl.c
字號:
/* passed * linux/fs/ioctl.c * * (C) 1991 Linus Torvalds */#include <set_seg.h>
#include <string.h>// 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。#include <errno.h>// 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <sys/stat.h>// 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。#include <linux/sched.h>// 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,
// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。
// 終端ioctl(chr_drv/tty_ioctl.c, 115)。extern int tty_ioctl(int dev, int cmd, int arg);
// 定義輸入輸出控制(ioctl)函數指針。typedef int (*ioctl_ptr)(int dev,int cmd,int arg);
// 定義系統中設備種數。#define NRDEVS ((sizeof (ioctl_table))/(sizeof (ioctl_ptr)))
// ioctl 操作函數指針表。static ioctl_ptr ioctl_table[]={ NULL, /* nodev */ NULL, /* /dev/mem */ NULL, /* /dev/fd */ NULL, /* /dev/hd */ tty_ioctl, /* /dev/ttyx */ tty_ioctl, /* /dev/tty */ NULL, /* /dev/lp */ NULL /* named pipes */};
//// 系統調用函數- 輸入輸出控制函數。
// 參數:fd - 文件描述符;cmd - 命令碼;arg - 參數。
// 返回:成功則返回0,否則返回出錯碼。int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg){ struct file * filp; int dev,mode;
// 如果文件描述符超出可打開的文件數,或者對應描述符的文件結構指針為空,則返回出錯碼,退出。 if (fd >= NR_OPEN || !(filp = current->filp[fd])) return -EBADF;
// 取對應文件的屬性。如果該文件不是字符文件,也不是塊設備文件,則返回出錯碼,退出。 mode=filp->f_inode->i_mode; if (!S_ISCHR(mode) && !S_ISBLK(mode)) return -EINVAL;
// 從字符或塊設備文件的i 節點中取設備號。如果設備號大于系統現有的設備數,則返回出錯號。 dev = filp->f_inode->i_zone[0]; if (MAJOR(dev) >= NRDEVS) return -ENODEV;
// 如果該設備在ioctl 函數指針表中沒有對應函數,則返回出錯碼。 if (!ioctl_table[MAJOR(dev)]) return -ENOTTY;
// 否則返回實際ioctl 函數返回碼,成功則返回0,否則返回出錯碼。 return ioctl_table[MAJOR(dev)](dev,cmd,arg);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -