分类: 系统运维
2012-03-28 13:01:32
ioctl函数总是包含了所有的I/O操作。任何不能用本章其它函数来表达的事情通常都需要ioctl来指定。终端I/O是这个函数的最大用户。(当我们到第18章时,我们将看到POSIX.1已经把终端I/O操作替换为单独的几个函数。)
#include
#include
#include
int ioctl(int filedes, int request, ...);
错误返回-1,成功返回其它值。
ioctl函数被作为一个处理STREAMS设备[Rago 1993]的扩展包含在单一UNIX规范里。然而UNIX系统实现却使用它执行许多混杂的设备操作。一些实现还把它扩展为可以操作普通文件。
我们展示的函数原型对应着POSIX.1。FreeBSD 5.2.1和Mac OS X 10.3把第二个参数声明为unsigned long。这种细节无关紧要,因为第二个参数总是一个头文件里的一个#defined名。
根据ISO C原型,省略号被用来表示剩余的参数。尽管如此,通常只有一个多余的参数,而它一般是指向一个变量或结构体的指针。
在这个原型里,我们只展示包含函数本身的头文件。通常需要额外的设备相关的头文件。比如超越了POSIX.1规定的基本操作的处理终端I/O的ioctl命令,都需要头文件
每个设备驱动器可以定义它自己的ioctl命令集。尽管如此,系统为不用类型的设备提供了一个通用的ioctl命令。下表给出一FreeBSD支持的这些通用iotcl的一些类目的例子:
通用FreeBSD ioctl操作 | |||
类目 | 常量名 | 头文件 | ioctl的数量 |
磁盘标签 | DIOXXX |
|
6 |
文件I/O | FIOXXX |
|
9 |
磁带I/O | MTIOXXX |
|
11 |
套接字I/O | SIOXXX |
|
60 |
终端I/O | TIOXXX |
|
444 |