?? ioctl.c
字號:
/** linux/fs/ioctl.c** (C) 1991 Linus Torvalds*/#include <string.h> // 字符串頭文件。主要定義了一些有關字符串操作的嵌入函數。#include <errno.h> // 錯誤號頭文件。包含系統中各種出錯號。(Linus 從minix 中引進的)。#include <sys/stat.h> // 文件狀態頭文件。含有文件或文件系統狀態結構stat{}和常量。#include <linux/sched.h> // 調度程序頭文件,定義了任務結構task_struct、初始任務0 的數據,// 還有一些有關描述符參數設置和獲取的嵌入式匯編函數宏語句。extern int tty_ioctl (int dev, int cmd, int arg); // 終端ioctl(chr_drv/tty_ioctl.c, 115)。// 定義輸入輸出控制(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,否則返回出錯碼。intsys_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 + -