设备管理(基础)
1.Linux
操作系统中的设备管理
Linux
系统使用了设备文件的概念来统一对设备的访问接口,在引入设备文件系统(devfs
)之前,Linux
系统将设备文件放在/dev
目录下,设备的命名一般为设备文件名+数字或字母表示的子类,例如/dev/bda1
,/dev/bda2
等。在Linux-2.4
内核中引入了设备文件系统进行统一管理,从而设备文件就可以挂载到任何需要的地方。
由上我们可以知道设备在系统中都是以文件的形式存在的
2./proc
特殊文件系统
/proc
是一特殊的文件系统,其目录下显示了系统运行时的各种动态信息,其中与设备管理有关的文件主要有以下几种。
(1)/proc/devices
文件:列出了主要的字符设备和块设备编号以及分配这些编号的驱动程序的名字。
示例:
cat /proc/devices
(2)/proc/ioports
文件:列出了对各种设备驱动程序(如磁盘,以太网卡,声卡等)注册的I/O端口范围。
示例:
cat /proc/ioports
右侧设备驱动程序的编号没必要追究,知道是该类设备驱动程序中设备x的编号即可
(3)/proc/dma
文件:列出了被驱动程序留作专用的DMA通道以及驱动程序赋予的名字。
示例:
cat /proc/dma
(4)/proc/scsi
目录:该目录下有一个文件/proc/scsi/scsi
和多个子目录/proc/scsi/$driver
,文件/proc/scsi/scsi
中记录了所有被检测到的SCSI
设备,每个$driver
子目录对应一个控制器驱动程序,子目录下的每一个文件/proc/scsi/$driver/$n
对应于安装的控制器的一个单独实例。
示例:
cd /proc/scsi
ls #查看/proc/scsi下的文件和子目录
ll #查看/proc/scsi下的文件和子目录及其权限、所有者、组、大小、创建日期等。
cd 子目录 #每一个子目录对应一个控制器驱动程序
cat 子文件 #子目录下的每一个文件对应安装的控制器的一个单独实例
3.相关系统调用
(1).mknod
:创建设备文件的命令/函数
函数原型:
int mknod (const char *pathnamee, mode_t mode, dev_t dev);
mknod
函数(命令)试图创建一个命名为pathname
的文件系统节点(文件,特殊设备文件或有名管道)。该节点被指定了存取许可权mode
和主次设备号dev
。
命令格式:
mknod [option] 设备文件名类型 [主设备号] [次设备号]
例如:
mknod/dev/ttyE0 c l6 0
#其中 /dev/ttE0是要创建的设备文件名, c指的是字符设备,16是主设备号,0是次设备号。
示例:
sudo mknod /dev/mydev c 10 1 #在名为dev的目录下创建名为mydev的字符设备文件,主次设备号为16,0
cd /dev/ #进入dev目录下
ls 或者 ls mydev #查找mydev文件
(2).mount/unmount
命令函数(临时挂载)
函数原型:
#include <sys/mount.h>
int mount (const char * type, const char * dir, int flags, void * data);
int unmount (const char * dir, int flags);
以下是常用的设备查看
指令(补充)
设备查看
示例:
mknod
命令格式:
设备挂载命令(补充)
条件
只有当设备具有ID时才能被挂载
设备挂载
示例:
df #先查看目前的设备挂载情况
sudo mount /dev/sr0 /mnt #挂载/dev/sr0 到/mnt
挂载u盘
u盘
插入前和插入后分别输入命令fdisk -l
,查看当前系统的分区表的变化:
插入u盘前
插入u盘后
挂载过程及结果
mkdir /dev/uu
mount /dev/sdb2 /dev/uu
(3).ioctl
控制设备
函数原型:
#include <sys/ioctl.h>
int ioctl (int d, int requset, char * argp)
ioctl
函数操纵特别文件中有关基本设备参数。
参数d
必须是一个已经打开的文件描述符。
用于说明request
参数的宏定义在文件<sys/ioctl.h>
中。
返回值:0成功返回
,-1失败返回
。
命令格式:
示例:
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
struct winsize ws; 定义一个 struct winsize 类型的变量,用于存储获取到的窗口大小信息
int t = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); #用t来记录ioctl函数的返回值
#这里的 STDOUT_FILENO 表示标准输出文件描述符,TIOCGWINSZ 是一个常量,表示获取终端窗口大小的命令,&ws 是一个指向 struct winsize 型的指针,用于存储获取到的窗口大小信息。
printf("Window size: %d rows x %d columns\n", ws.ws_row, ws.ws_col);
#用ws 变量来访问获取到的窗口大小信息
printf("t=%d\n",t); #输出ioctl函数的返回值
return 0;
}
输出结果
输出到虚拟设备(补充)
./test > /dev/null
使用命令打印当前终端的设备文件名
tty
编辑读取键盘输入的信息,并显示出来
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
int fatal(char * mes)
{
perror(mes);
exit(1);
}
int main()
{
int fd,rd;
char str[1024];
if((fd = open("/dev/tty",O_RDONLY)) < 0)//打开/dev/tty失败
fatal("open /dev/tty");//fatal来处理这个致命错误
if((rd = read(fd,str,1024)) < 0)//读入失败
fatal("read");/fatal来处理这个致命错误
else
printf("/dev/tty:: %s\n",str);
close(fd);
return 0;
}
源程序及其输出结果